Передача одного и того же аргумента в несколько вложенных функций - PullRequest
0 голосов
/ 25 ноября 2018

Я хотел бы передать один и тот же аргумент нескольким вложенным функциям.Например, учитывая 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 , но я специально хочу передать то же самое аргумент для нескольких вложенных функций.

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

В вашем примере ... - это то, что следует за аргументом 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
 }
0 голосов
/ 28 ноября 2018

Другое, несколько менее надежное, но, возможно, более простое решение по сравнению с Камилем, заключается в том, чтобы полагаться на порядок аргументов определенных функций следующим образом:

fun1 = function(x){x^2}
fun2 = function(x,FUN,...) { x + FUN(...) }

Затем запустить fun2 как:

 > fun2(x=10,FUN=fun1,10)
 [1] 110 

Это опять-таки основано на знании порядка аргументов функции, что несколько опасно.

0 голосов
/ 25 ноября 2018

x s не одинаковы в обеих функциях.

Учтите это:

fun1 <- function(y) y^2 
fun2 <- function(x,FUN) x + FUN(x) 

> fun2(x=10, FUN=fun1)
[1] 110

Видите ли, если вы не передадите аргумент с FUN(x),fun1() не распознает x=10.

...