如何将父函数中的"..."参数传递给r中的两个子函数

kin*_*olf 8 r function

我试图将一组参数传递给一个函数.该函数有两个子函数,它们参与上述参数集.

在下面的"简化"示例中 f_combined是一个函数,它需要... 进行以下函数调用,以便xx传递给f_sqryy传递给f_plus:

f_combined(xx = 2, yy = 2)
Run Code Online (Sandbox Code Playgroud)

但它会给我一个错误:

Error in f_sqr(...) : unused argument (yy = 2) 
Run Code Online (Sandbox Code Playgroud)

任何建议?

f_sqr <- function(xx =1){
  xx ^ 2
}

f_plus <- function(yy =1){
  yy + 1
}

f_combined <- function(...){
  f_sqr(...) + f_plus(...)
}
Run Code Online (Sandbox Code Playgroud)

B.M*_*.W. 13

您可以...作为命名的成对列表进行访问,也可以按顺序访问它..n

f_sqr <- function(xx =1){xx ^ 2}
f_plus <- function(yy =1){yy + 1}

f_combined <- function(...){
  print(f_sqr(list(...)$xx))
  print(f_plus(list(...)$yy))
  print(f_sqr(..1))
  print(f_plus(..2))
}
f_combined( yy = 1, xx = 10)

[1] 100 (element with name xx of the list ...)
[1] 2 (element with name yy of the list ...)
[1] 1 (the first argument in the list ...)
[1] 11 (the second argument in the list ...)
Run Code Online (Sandbox Code Playgroud)

输出 ?"..."

10.4'......'论点

另一个常见的要求是允许一个函数将参数设置传递给另一个函数.例如,许多图形函数使用函数par(),函数如plot()允许用户将图形参数传递给par()来控制图形输出.(有关par()函数的更多详细信息,请参阅par()函数.)这可以通过包含函数的额外参数(字面意思为"...")来完成,然后可以传递该参数.下面给出一个大纲示例.

 fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {
   [omitted statements]
   if (graph)
     par(pch="*", ...)
   [more omissions]
 } 
Run Code Online (Sandbox Code Playgroud)

不太常见的是,函数需要引用'...'的组件.表达式列表(...)计算所有这些参数并将它们返回到命名列表中,而..1,..2等等一次评估它们,".. n"返回不匹配的第n个论点.

  • 如果省略两个参数中的一个,这将失败.例如``f_combined(yy = 1)`将不会给出预期的结果. (2认同)

MrF*_*ick 9

或者,您可以查询函数formals()以查看它所期望的命名参数,并仅传递它们.如果"child"函数接受...,那么我们将传递所有参数.这种方法不适用于位置参数.

f_combined <- function(..., .fns =list(f_sqr, f_plus), .reduce=`+`){
   dots <- list(...)
   Reduce(.reduce, lapply(.fns, function(f) {
       if ("..." %in% names(formals(f))) {
           do.call(f, dots)
       } else if ( any( names(dots) %in% names(formals(f)) ) ) {
           do.call(f, dots[names(formals(f))])
       } else {
           f()
       }
   }))
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将两个函数设置为参数(.fns=list(f_sqr, f_plus)),以便可以轻松更改或更轻松地添加.我还设置了一个参数,指定如何组合这些值,如果你想要除了求和(.reduce='+')之外的其他东西.但基本的想法是找到最好的数学命名参数集并传递它们.由于您的"子"函数也具有其参数的默认值,因此它们将在您不传递任何参数时运行.

以下是一些示例调用

f_combined()
# [1] 3
f_combined(xx=2)
# [1] 6
f_combined(yy=2)
# [1] 4
f_combined(xx = 2, yy = 2)
# [1] 7
Run Code Online (Sandbox Code Playgroud)