В R, как передать аргументы из внешней функции во внутреннюю функцию? - PullRequest
0 голосов
/ 10 февраля 2019

В R я пытаюсь передать аргументы из внешней функции во внутреннюю функцию, где они будут оцениваться.Это терпит неудачу, по-видимому, потому что аргументы не оцениваются при их передаче.

Вот два примера;один использует match.call () для захвата аргументов внешней функции и их передачи, другой вручную связывает аргументы внешней функции в списке, а затем вызывает внутреннюю функцию.Я подозреваю, что мне не удается понять некоторые тонкости match.call () и ленивую оценку.Есть ли элегантный способ решить эту проблему?

# Use match.call to pass arguments to inner_function
outer_fun_a <- function(formula, data){
  args <- as.list(match.call())[-1]
  mods <- names(get_all_vars(formula, data = data))[-1]
  inner_function(mods, args)
}
# Make a list of the arguments of outer_fun_b
outer_fun_b <- function(formula, data){
  args <- list(formula = formula, data = data)
  mods <- names(get_all_vars(formula, data = data))[-1]
  inner_function(mods, args)
}

inner_function <- function(modvars, args){
  args$formula <- update(args$formula, paste0("~ ", paste(modvars, collapse = " + ")))
  do.call(lm, args)
}

df <- iris
# This fails, because the arguments in args have not been evuated
outer_fun_a(as.formula(paste0("Sepal.Length ~ ", paste(names(df)[2:5], collapse = " + "))),
            df)
# This succeeds
outer_fun_b(as.formula(paste0("Sepal.Length ~ ", paste(names(df)[2:5], collapse = " + "))),
            df)
...