R 如何使此代码更加紧凑/高效?

R 如何使此代码更加紧凑/高效?,r,loops,R,Loops,我很抱歉问了一个简单的问题,但我正在尝试第一次学习如何在R中使用for循环,并且没有太多的运气概括任何指南向我展示的关于我的特定问题或一般问题的内容!我需要根据专家的意见做出许多不同的分布,并且可以通过将三角形分布相加来实现。但是,代码不是很好,我认为可以通过使用for循环来改进,但我不确定如何改进,尤其是因为所有的min/max/mode估计值都不同。我该如何改进这一点?以下代码仅适用于18个发行版中的一个: library(mc2d) x <- seq(from=0.5, to=6,

我很抱歉问了一个简单的问题,但我正在尝试第一次学习如何在R中使用for循环,并且没有太多的运气概括任何指南向我展示的关于我的特定问题或一般问题的内容!我需要根据专家的意见做出许多不同的分布,并且可以通过将三角形分布相加来实现。但是,代码不是很好,我认为可以通过使用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)

您可以尝试仅在前三个发行版中执行类似的操作

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开始,通过单个语句创建表达式并将其粘贴在一起,然后对其求值并将其分配给june。酷

您可以尝试这样做,仅对前三个分布执行此操作

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开始,通过单个语句创建表达式并将其粘贴在一起,然后对其求值并将其分配给june。根据@Luca的答案,我将使用apply和rowSums:

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

根据@Luca的答案,我将使用apply和rowSums:

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

通常,使用该语言比使用粘贴在一起并进行计算的字符串更好。专家们说:

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))
这给出了一个结果列表,您希望通过将它们相加将它们减少为单个值

Reduce(`+`, val)
合并:

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

通常,使用该语言比使用粘贴在一起并进行计算的字符串更好。专家们说:

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))
这给出了一个结果列表,您希望通过将它们相加将它们减少为单个值

Reduce(`+`, val)
合并:

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


@休-我猜这个软件包有一个功能:你应该添加所有的软件包依赖项。嗨,休-最近的邮件是对的,它是一个替代三角分布的建模专家意见。我刚刚编辑了这个问题,因为三角形分布更为常见。最大/分钟/模式在分布之间如何变化?这里到底发生了什么变化?x是否保持不变?是的-因此对于本例中的每个总体分布,我只显示了一个,june.cool,x应该保持不变。它只是一个从最小值到最大值的任意向量,用来运行密度函数。每个单独的数据采集都有不同的最小/最大/模式,因为这是一位专家对参数的意见。因此,在本例中,对于min=1、max=2和mode=1,这是一个人对产品在6月份冷却所需时间的估计。@Hugh-我猜这个软件包有一个功能:您应该添加所有软件包依赖项。您好Hugh-LateMail是对的,它是建模专家意见的三角形分布的替代方法。我刚刚编辑了这个问题,因为三角形分布更为常见。最大/分钟/模式在分布之间如何变化?这里到底发生了什么变化?x是否保持不变?是的-因此对于本例中的每个总体分布,我只显示了一个,june.cool,x应该保持不变。它只是一个从最小值到最大值的任意向量,用来运行密度函数。每个单独的数据采集都有不同的最小/最大/模式,因为这是一位专家对参数的意见。所以在本例中,对于min=1、max=2和mode=1,这是一个人对产品在6月份冷却所需时间的估计。这正是我想要的!这里有很多我不认识的命令,所以我会很高兴地查找它们:我希望我能自己弄清楚怎么做,但我想这需要更多的R经验。谢谢,LucaI不知道地图,但我认为@Neal的方式肯定比我的好!是的,我确实喜欢智力上的诚实:有些时候,例如在for循环中,我发现evalparsetext=foo技巧很有用。这正是我一直在寻找的东西!这里有很多我不认识的命令,所以我会很高兴地查找它们:我希望我能自己弄清楚怎么做,但我想这需要更多的R经验。谢谢,LucaI不知道地图,但我认为@Neal的方式肯定比我的好!是的,我确实喜欢智力上的诚实:在其他一些时候,例如在for循环中,我发现evalparsetext=foo trickHi Martin很有用-你说使用语言-你的确切意思是什么?你选择的答案创建一个表示要计算的表达式的字符串,然后计算它。相比之下,@NealFultz的答案和我的答案直接与引用您希望转换的值的符号一起工作。您好,Martin-您说的是与语言一起工作-您的确切意思是什么?您选择的答案创建了一个表示要计算的表达式的字符串,然后对其进行计算。相比之下,@NealFultz的答案和我的答案是有效的 直接使用引用要转换的值的符号。