1

我想做一個有條件的cumsum。我原本以爲我可以使用Reduce功能,但我不能。要解釋清楚:R - 將遞歸代碼轉換爲函數式編程

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

我可以」 t似乎找到了一種方法來標記這個問題爲已關閉由於版主繼續刪除我添加的任何東西,但沒有建議關閉的正確方法。

+0

我不明白這是怎麼遞歸?你的例子也需要更清楚。作爲一個例子給出確切的預期結果。不要只是描述它。 – 2013-03-14 14:09:50

+0

我已經通過將它放在函數格式中闡明瞭遞歸。當然,沒有明確的「預期答案」,因爲涉及到隨機性。如果你喜歡,我可以使用一些固定值來使它更清晰,但我不希望讀者使用固定的數學公式來回答,我想了解如何使用高階函數來完成此操作。 – user1480926 2013-03-14 14:20:27

+1

@ user1480926我不認爲這是Reduce的一項工作。首先你不能給矩陣來減少。你可以給一個向量(也許你可以創建一個向量,你可以在a和b之間交替)其次,你的索引變量必須是全局變量,比如'index << - index + 1'... – agstudy 2013-03-14 15:59:24

回答

2

我不認爲你需要Reduce在這裏。這裏說的解釋Reduce的使用情況爲例:

Reduce(paste,list(1:3,letters[1:3],LETTERS[1:3])) 
[1] "1 a A" "2 b B" "3 c C" 

我想你試着做什麼XAN使用ifelse來完成,它被量化。這裏例如是從初始值開始的a和b的條件累積和。

a <- rep(1,5) 
b <- rep(0.01,5) 
init <- 200 
x <- seq_along(a) 
cumsum(c(init,ifelse(x %% 2 ,a[x], b[x]))) 
[1] 200.00 201.00 201.01 202.01 202.02 203.02 

當然,如果你有多個條件:

  • 使用多個條件:x %% 2 & x^2 < 5
  • 使用嵌套ifelseifelse(x %% 2 ,ifelse(x^2 <2, a[x], b[x]),1)
+0

你可以看到我的更新。 – agstudy 2013-03-15 05:18:47

+0

您好agstudy什麼將是一個乾淨的方式來做更多的ifs。例如:if {a} elseif {b} elseif {c} else {d}?除了[x] b [x](例如,如果我有ac [x],d [x])以外,還有更多選項? – user1480926 2013-03-15 08:29:33

+0

@ user1480926將僞代碼中的條件添加到OP中,我將幫助編寫它。 – agstudy 2013-03-15 08:31:29