Определить пользовательскую функцию для добавления / вычитания из tibble

#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. Вы правы. Я не знаю, почему это так? Хммм. Спасибо.