Я хотел бы передать один и тот же аргумент нескольким вложенным функциям. Например, даны 2 функции:
fun1 = function(x){x^2}
fun2 = function(x,FUN,...) { x + FUN(...) }
Я бы хотел реализовать что-то вроде этого:
fun2(x=10,FUN=fun1) ## this returns error
В этом примере я хотел бы получить результат 10 + 10 ^ 2 = 110
Я видел этот ответ на вопрос: Передача произвольных аргументов нескольким вложенным функциям в R, но я специально хочу передать аргумент такой же нескольким вложенным функциям.





x не одинаковы по обеим функциям.
Учти это:
fun1 <- function(y) y^2
fun2 <- function(x,FUN) x + FUN(x)
> fun2(x=10, FUN=fun1)
[1] 110
Видите ли, если вы не передадите аргумент с FUN(x), fun1() не распознает x=10.
Мне нравится то, что вы здесь делаете, но у меня 2 комментария. (i) определение fun1 в терминах x (т.е. fun1 <- function (x) {x ^ 2}) вернет правильный результат и (ii) я ищу более общий ответ. То, как вы определяете fun2, указывает на то, что функция ввода (FUN) всегда будет зависеть от x, что не обязательно верно. Было бы неплохо иметь решение, в котором входная функция (FUN) не требует явного определения входных данных.
В вашем примере ... - это то, что следует за аргументом FUN, т.е. ничего. Вы можете поиграть с sys.call, чтобы повторно использовать аргументы, например:
fun2 <- function(FUN, x, ...) {
cl <- match.call(expand.dots = TRUE) # unevaluated expression `fun2(x=10,FUN=fun1)`
# Note: sys.call would work only if the arguments were named
cl[[1]] <- cl$FUN # substitute `fun2`. Now cl is `fun1(x=10,FUN=fun1)`
cl$FUN <- NULL # remove FUN argument. Now cl is `fun1(x=10)`
result.of.FUN <- eval.parent(cl) # evaluate the modified expression
x + result.of.FUN
}
Другое несколько менее надежное, но, возможно, более простое решение по сравнению с решением Камила - полагаться на порядок аргументов определенных функций как таковых:
fun1 = function(x){x^2}
fun2 = function(x,FUN,...) { x + FUN(...) }
Затем запустите fun2 как:
> fun2(x=10,FUN=fun1,10)
[1] 110
Это снова зависит от знания порядка аргументов функции, что в некоторой степени опасно.
на всякий случай, почему бы вместо этого не использовать заводскую функцию? (см. adv-r.hadley.nz/function-factories.html)