【发布时间】:2013-03-02 22:00:40
【问题描述】:
我想做一个有条件的cumsum。我原本以为我可以使用 Reduce 功能,但我不能。解释清楚:
a <- rep(1,5)
b <- rnorm(n=5,mean=0.5)
c <- rep(2,5)
d <- rep(0.5,5)
Reduce( '+', a, init=200 , accumulate=TRUE)
结果
[1] 200 201 202 203 204 205
这就像一个简单的cumsum。但我真正想要的是一个有条件的 cumsum:
递归定义为:
x0 = 200
index = 0
function (x) {
index = index + 1
if( x is between 200 and 202 ) return x + a[index]
else if(x is between 202 and 204) return x + b[index]
else if(x is between 204 and 206) return x + c[index]
else return x + d[index]
}
预期的结果可能是这样的(当然,由于随机性,它永远不会相同。
[1] 200 201 202.3 203.8 204.1 205
有兴趣的可以在这里找到答案: Convert simple recursive relation to functional program
我似乎找不到将这个问题标记为已关闭的方法,因为版主一直在删除我添加的任何内容,而没有建议正确的关闭方法。
【问题讨论】:
-
我不明白这个递归是怎么回事?你的例子也需要更清楚。也给出确切的期望结果作为示例。不要只是描述它。
-
我已经通过将递归置于函数格式中来阐明它。当然,没有明确的“预期答案”,因为其中涉及随机性。如果您愿意,我可以通过使用一些固定值来使其更清楚,但我不希望读者使用固定的数学公式来回答,我想了解如何使用高阶函数来做到这一点。
-
@user1480926 我认为这不是 Reduce 的工作。首先你不能给Reduce一个矩阵。你可以只给出一个向量(也许你可以创建一个向量,在 a 和 b 之间交替)其次你的索引变量必须是一个全局变量,比如
index <<- index +1... -
感谢@agstudy,那么在处理比 R 中的向量更复杂的数据时,有没有办法使用优雅的高阶函数?
-
@user1480926 我不能说没有。我是说这不是
Reduce的工作,至少在你介绍它时是这样。您是否有一个很大的工作流程,您尝试在 2 个列表之间交替,或者只是想学习Reduce?
标签: r recursion functional-programming reduce higher-order-functions