我如何使这个代码更紧凑/更有效?

时间:2014-04-03 22:20:17

标签: r loops

我为提出一个简单的问题而道歉,但我想第一次学习如何在R中使用for-loops而且没有太多的运气概括了任何指南告诉我的具体问题(或者一般来说!)我需要从专家意见中做出很多(~18)不同的分布,并且可以通过将三角形分布一起添加来实现。但是,代码并不是很好,我认为可以使用for循环进行改进,但我不确定如何 - 特别是因为所有的min / max / mode估计都不同。我怎么能改善这个? (以下代码仅适用于18个发行版之一):

library(mc2d)
x <- seq(from=0.5, to=6, by=0.001)
june.cool <- dtriang(x, min=1,   max=2, mode=1)   +
             dtriang(x, min=1,   max=4, mode=2)   +
             dtriang(x, min=0.5, max=1, mode=1)   +
             dtriang(x, min=2,   max=4, mode=3)   +
             dtriang(x, min=0.25,max=1, mode=1)   +   
             dtriang(x, min=1,   max=3, mode=2)   +
             dtriang(x, min=0.5, max=2, mode=1)   +
             dtriang(x, min=1,   max=5, mode=2.5) +
             dtriang(x, min=1,   max=6, mode=4)

3 个答案:

答案 0 :(得分:4)

重复@Luca的回答,我会使用apply和rowSums:

 rowSums(  apply(values, 1, function(args) dtriang(x, min=args[1],
                                                max=args[2],
                                                mode=args[3])
                                        ))

答案 1 :(得分:2)

使用该语言通常更好,而不是粘贴在一起并进行评估的字符串。专家说:

xprt <- data.frame(min=c(1, 1, .5, 2, .25, 1, .5, 1, 1),
                   max=c(2, 4, 1, 4, 1,3, 2, 5, 6),
                   mode=c(1, 2, 1, 3, 1, 2, 1, 2.5, 4))

您希望Map使用dtriang,每行使用一个新值,并附加一个参数(跨行的常量)x,所以

val <- with(xprt, Map(dtriang, min=min, max=max, mode=mode, MoreArgs=list(x=x)))

这会给出一个结果列表,您希望通过将它们相加来将它们减少为单个值

Reduce(`+`, val)

组合:

with(xprt, {
    Reduce(`+`, Map(dtriang, min=min, max=max, mode=mode, MoreArgs=list(x=x)))
})

答案 2 :(得分:1)

您可以尝试这样的事情(仅针对前三个发行版进行)

values <- data.frame(min = c(1,1,0.5),
                     max = c(2,4,1),
                     mode = c(1,2,1))

june.cool <- eval(parse(text=paste(apply(values, 1, function(my.row)
               sprintf("dtriang(x, min=%f, max=%f, mode=%f) ",
                   my.row["min"], my.row["max"], my.row["mode"])),
           collapse = " + ")
))

从指定分布参数的data.frame开始,通过单个语句创建表达式并paste一起创建表达式,然后对其进行评估并将其分配给june.cool