我想编写一个小函数来从适当的发行版生成样本,例如:
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
我猜我在某个地方错过了一个小包装函数,但无法弄明白。
谢谢!
答案 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))
看起来如果列表在任何位置,结果是一个列表(这是用例中的一个理想特征)