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

9

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

?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

8
дёғдғ†е®Њж•өпәЊж‰§иҰЊdo.call(mean, c(list(1:10), gm))гЂ‚жіЁж„ЏдҢүз”Ёlist(1:10, gm)е’Њc(list(1:10), gm)иү”е›һзљ„еҮ№и±ҰеҢұзЉ¶пә€й•үеғ¦пә‰д№‹й—өзљ„е·®еә‚гЂ‚ - MrFlick
3个回答

1
如评论所述,你的gmdo.call中的形状不正确,它将你的选项列表解释为trim参数。
为使参数正确,请使用c:
gm <- list(trim=0, na.rm=FALSE)
do.call(mean, c(list(1:10), gm))
[1] 5.5

1

这也可以通过rlang::exec和反引号展开运算符!!!来实现。

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

0

如果您需要重复设置默认参数,可以使用formals来代替使用do.call。以下是示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接