Передача аргументов в квазикавычках во вложенных функциях

Ниже я написал простую функцию snafu(), которая вычисляет новую переменную snafu_var.

library(dplyr)

df <- mtcars %>% select(am, cyl) %>% slice(1:5)

snafu <- function(data, var1, var2){
  require(dplyr)

  var1 <- enquo(var1)
  var2 <- enquo(var2)

  data %>% mutate(snafu_var = !!var1 + !!var2)
}

snafu(df, var1 = am, var2 = cyl)

Теперь я хочу вложить snafu() в другую функцию foobar(), которая будет использовать переменную, созданную snafu().

foobar <- function(data, var1, var2) {
  require(dplyr)

  data <- snafu(data, var1, var2)

  data %>% mutate(foo_var = snafu_var + 1)
}

foobar(df, var1 = am, var2 = cyl)

Я борюсь по двум пунктам (вероятно, связанным):

1) Вложенная функция в foobar() не может получить доступ к аргументам, предоставленным foobar(), что приводит к сообщению об ошибке:

Error in mutate_impl(.data, dots) : 
  Evaluation error: object 'am' not found.

2) Как только я заставлю вложенную функцию работать, как я могу вызвать ее вывод snafu_var внутри функции foobar()?

Это просто повторение более сложной вложенной функции, но для решения моей проблемы важно, чтобы функции были вложенными, а переменная, созданная вложенной функцией snafu(), использовалась родительской функцией foobar().


person Joe    schedule 28.08.2018    source источник


Ответы (1)


Используйте ... в foobar:

foobar <- function(data, ...) {

  data <- snafu(data, ...)

  data %>% mutate(foo_var = snafu_var + 1)
}
person G. Grothendieck    schedule 28.08.2018
comment
есть ли способ передать аргументы в snafu, если они были явно названы в foobar? В вашей версии foobar() было бы загадочно знать, какие аргументы должны быть названы. - person Joe; 30.08.2018