将命名参数列表传递给函数?

66
我希望编写一个小函数来从适当的分布中生成样本,类似于这样:
makeSample <- function(n,dist,params)
values <- makeSample(100,"unif",list(min=0,max=10))
values <- makeSample(100,"norm",list(mean=0,sd=1))

大部分代码工作正常,但我无法弄清楚如何为每个分布传递命名参数。例如:

params <- list(min=0, max=1)
runif(n=100,min=0,max=1) # works
do.call(runif,list(n=100,min=0,max=1)) # works
do.call(runif,list(n=100,params)) # doesn't work

我猜测我可能缺少一个包装函数,但是无法弄清楚。

谢谢!

3个回答

107

快要成功了:试一试

do.call(runif,c(list(n=100),params)) 

你的变量 list(n=100,params) 是一个列表,其中第二个元素是你的参数列表。 使用str()比较 list(n = 100,params)c(list(n = 100),params)的结构...


我只是想添加一个注释:c() 操作本质上通过从第二个列表(params)中添加项来扩展现有列表,即 list(n=100)。 - Jerry T

14

c(...) 具有串联效果,或者按照函数式编程的说法,具有扁平化效果,因此可以缩短调用;您的代码将是:

c(...)具有连接作用,或者按照函数式编程的说法,具有扁平化作用,因此您可以缩短调用。您的代码将会是:

params <- list(min=0, max=1)
do.call(runif, c(n=100, params))

尝试以下比较:

params = list(min=0, max=1)
str(c(n=100, min=0, max=1))
str(list(n=100, min=0, max=1))
str(c(list(n=100),params))
str(c(n=100,params))

看起来如果列表在任何时候都存在,结果将是一个列表(这在此使用情况下是一种理想的特性)。


4

rlang::exec 可以使任何函数支持动态参数。

args <- list(x = c(1:10, 100, NA), na.rm = TRUE)
rlang::exec(mean, !!!args)

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