繁体   English   中英

如何在R函数中将参数作为列表传递

[英]how to pass arguments as a list in R function

我有很多参数的函数。 所以我想创建一个参数列表并将它们传递给函数。

?mean函数为例:

mean(x, trim = 0, na.rm = FALSE, ...)

所以假设我想计算1:10平均值,分配给变量x ,但将其他参数作为列表传递:

gm <- list (trim = 0, na.rm = FALSE)

mean(1:10, gm)
#R> Error in mean.default(1:10, gm) : 'trim' must be numeric of length one

我尝试使用do.call但也不起作用。

do.call(mean,list(1:10, gm))
#R> Error in mean.default(1:10, list(trim = 0, na.rm = FALSE)) : 
#R>   'trim' must be numeric of length one

如评论中所述,您的gmdo.call形状错误,它将您的选项列表解释为trim参数。

要使参数正确形状,请使用c

gm <- list(trim=0, na.rm=FALSE)
do.call(mean, c(list(1:10), gm))
[1] 5.5

这也可以用rlang::exec和 unquote-splice 操作符来完成, !!! .

rlang::exec(mean, 1:10, !!!gm)
#> [1] 5.5

您可以设置默认参数,如果您重复执行此操作作为使用do.call的替代方法,这可能会很方便。 你可以做到这一点formals如下:

f <- mean.default
formals(f)[match(names(formals(f)), names(gm))] <- gm

f(1:10)
#R> [1] 5.5

这有一些需要注意的极端情况。 一方面,我使用mean.default而不是mean ,否则我必须将来自gm的参数放在...之前。

do.call另一种替代方法是创建一个call并使用eval

cl <- as.call(c(list(quote(mean), x = 1:10), gm))
cl
#R> mean(x = 1:10, trim = 0, na.rm = FALSE)

eval(cl)
#R> [1] 5.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM