Передача всех аргументов в другую функцию - PullRequest
0 голосов
/ 28 июня 2019

Я хотел бы иметь возможность передавать текущие аргументы в функции в другую функцию без индивидуального перечисления каждого из аргументов.Это для чуть более сложной функции, которая будет иметь около 15 аргументов с добавлением потенциально большего количества аргументов позже (она основана на API для данных, которые могут добавить более сложные данные позже):

f_nested <- function(a, b, ...) {
  c <- a + b
  return(c)
}

f_main <- function(a, b) {

  d <- do.call(f_nested, as.list(match.call(expand.dots = FALSE)[-1]))

  c <- 2 / d

  return(c)
}

f_main(2, 3)
#> [1] 0.4

sapply(2:4, function(x) f_main(x, 4))
#> Error in (function (a, b, ...) : object 'x' not found

Создано в 2019-06-28 пакетом представлений (v0.3.0)

Первый вызов f_main (2, 3) дает ожидаемый результат.Однако при переборе вектора значений со значением sapply возникает ошибка, что объект не был найден.Я подозреваю, что мое match.call() использование неверно, и я хотел бы иметь возможность перебирать мою функцию.

1 Ответ

1 голос
/ 28 июня 2019

Я заимствую из lm используемого match.call, заменив первый элемент следующей функцией. Я думаю, что одним из ключей является вызов eval с parent.frame(), чтобы x было разрешено правильно.

# no change
f_nested <- function(a, b, ...) {
  c <- a + b
  return(c)
}
# changed, using `eval` instead of `do.call`, reassigning the function name
f_main <- function(a, b) {
  thiscall <- match.call(expand.dots = TRUE)
  thiscall[[1]] <- as.name("f_nested")
  d <- eval(thiscall, envir = parent.frame())
  c <- 2 / d
  return(c)
}
sapply(2:4, function(x) f_main(x, 4))
# [1] 0.3333333 0.2857143 0.2500000

Как предложил @MrFlick, это можно немного сократить с помощью:

f_main <- function(a, b) {
  thiscall <- match.call(expand.dots = TRUE)
  thiscall[[1]] <- as.name("f_nested")
  d <- eval.parent(thiscall)
  c <- 2 / d
  return(c)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...