【问题标题】:Passing list of named parameters to function?将命名参数列表传递给函数?
【发布时间】:2012-02-03 13:52:37
【问题描述】:

我想编写一个小函数来从适当的分布中生成样本,例如:

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

我猜我在某处遗漏了一个小包装函数,但无法弄清楚。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    差不多了:试试

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

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

    【讨论】:

    • 只想添加一条评论:c() 操作本质上扩展/扩展了现有列表——即,list(n=100)——通过添加第二个列表中的项目—— -即,参数。
    【解决方案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))
    

    看起来如果一个列表在任何时候都在那里,结果是一个列表(在这个用例中这是一个理想的特性)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多