我试图将一组参数传递给一个函数.该函数有两个子函数,它们参与上述参数集.
在下面的"简化"示例中
f_combined是一个函数,它需要...
进行以下函数调用,以便xx传递给f_sqr并yy传递给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()函数.)这可以通过包含函数的额外参数(字面意思为"...")来完成,然后可以传递该参数.下面给出一个大纲示例.
Run Code Online (Sandbox Code Playgroud)fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) { [omitted statements] if (graph) par(pch="*", ...) [more omissions] }不太常见的是,函数需要引用'...'的组件.表达式列表(...)计算所有这些参数并将它们返回到命名列表中,而..1,..2等等一次评估它们,".. n"返回不匹配的第n个论点.
或者,您可以查询函数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)