#r #function #dplyr
#r #функция #dplyr
Вопрос:
Я пытаюсь написать функцию, которая будет подталкивать узлы в графике, который работает с матрицами компоновки в R. Я работаю с ggraph
в первую очередь, поэтому важно, чтобы она была dplyr
в стиле.
Моя функция хорошо работает, когда я хочу подтолкнуть в положительных направлениях, но не для отрицательных направлений. Я попытался обернуть parathesis вокруг аргументов, но, похоже, это не работает. Есть идеи? Вот пример:
Сгенерировать матрицу компоновки, подходящую для большинства графических пакетов в R.
set.seed(123)
layout <- matrix(nrow = 5, ncol = 2, sample(seq(0, 1, .1), 10, T))
Определить мою пользовательскую функцию, которая принимает matrix
, преобразует ее в tibble
, затем использует mutate
и ifelse
.
layout_nudge <- function(layout.,
node. = 1,
x. = 0,
y. = 0){
as.tibble(layout.) %>%
set_names('x.', 'y.') %>%
mutate(id = row_number(),
x. = ifelse(id == node., x. x, x.),
y. = ifelse(id == node., y. y, y.))
}
## ADDITION
# Works
# Convert to a tibble,
# For node 1, add 1 to column x
# For node 1, add 1 to column y
layout_nudge(layout, 1, 1, 1)
# A tibble: 5 x 3
x. y. id
<dbl> <dbl> <int>
1 1.9 0.7 1
2 0.7 0.5 2
3 0.7 0.6 3
4 1 0.3 4
5 0.7 0.1 5
## SUBTRACTION
# Does not work
# Convert to a tibble,
# For node 1, subtract 1 from column x
# For node 1, subtract 1 from column y
layout_nudge(layout, 1, -1, -1)
# A tibble: 5 x 3
x. y. id
<dbl> <dbl> <int>
1 1.9 0.7 1
2 0.7 0.5 2
3 0.7 0.6 3
4 1 0.3 4
5 0.7 0.1 5
Комментарии:
1. возможно, вы имели в виду использовать
x
иy
в качестве параметров функции вместоx.
иy.
?
Ответ №1:
не удается воспроизвести вашу проблему. Работает довольно нормально, если я редактирую функцию следующим образом ( x.
y.
в заголовке функции было изменено на x1
соответственно. y1
)
layout_nudge <- function(layout.,
node. = 1,
x1 = 0,
y1 = 0){
as.tibble(layout.) %>%
set_names('x.', 'y.') %>%
mutate(id = row_number(),
x. = ifelse(id == node., x. x1, x.),
y. = ifelse(id == node., y. y1, y.))
}
Комментарии:
1. Вы правы. Я не знаю, почему это так? Хммм. Спасибо.