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

时间:2012-02-03 13:52:37

标签: r

我想编写一个小函数来从适当的发行版生成样本,例如:

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

我猜我在某个地方错过了一个小包装函数,但无法弄明白。

谢谢!

2 个答案:

答案 0 :(得分:67)

几乎就在那里:尝试

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

您的变体list(n=100,params)会生成一个列表,其中第二个元素是您的参数列表。使用str()来比较list(n=100,params)c(list(n=100),params) ...

的结构

答案 1 :(得分:2)

c(...)具有连接效果,或者在FP用语中,具有展平效果,因此您可以缩短通话时间;你的代码是:

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))

看起来如果列表在任何位置,结果是一个列表(这是用例中的一个理想特征)