2015-10-06 94 views
-1

我有一個循環,我想執行,取決於代碼中前一個循環的輸出。這是代碼;循環將不會在R執行

holder <- list() 
if (i < historyLength) movement <- movementType(relAngle, angleThreshold) 

else if (i > historyLength-1) { 
    # Array to store speeds 
    speedHistory <- array(historyLength) 
    n = historyLength-1 
    # get the speeds from the previous n (hisoryLength) "Movements" 
    for (j in seq(1, length(historyLength))){ 
    speedHistory [n] = R[i-j, 6] 
    n-1 
    } 

    if (!bayesFilter(speedHistory, minSpeed, GPS_accy)) movement <- "non-moving" 
    else if(bayesFilter(speedHistory, minSpeed, GPS_accy)) movement <- movementType(relAngle, angleThreshold) 

} 


holder [[i]] <- (movement) 
for (t in seq(1, length(holder))){ 
    if (t == t-1) 
    changes <- 0 
    else if (t != t-1) 
    changes <- 1 
} 

你看不到循環的開始,但它會產生一個稱爲'移動'的數據列。

我試圖暫時將「移動」存儲在對象'持有者'中。然後我想要的是循環底部的「持有者」,並將標籤更改爲另一列中的0或1。基本上,如果下一個「移動」不等於先前的記錄,那麼改變爲0等等。我認爲問題可能與對象「持有者」有關?

目前我得到它的循環,但它只打印出一列'1'。

任何幫助非常感謝!謝謝。

目前得到以下的輸出:

Movement  Changes 
left    1 
right    1 
forward   1 
non-moving   1 
non-moving   1 

認爲問題出在移動存儲列表?對不起,如果我知道問題出在哪裏,我會更具體。真的很新鮮!

我最終得到一個數據框,其中包含列標題「Distance」「Speed」「Heading」「Movement」和「Changes」。它的循環很好,但由於某種原因,在上面的1列中更改了reults。下面是否有一個明顯的錯誤?:

holder[[i]] <- (movement) 
for (t in seq(1, length(holder))){ 
    if (t == t-1) 
    changes <- 0 
    else if (t != t-1) 
    changes <- 1 

我也試過這個,但後來它根本沒有循環。

holder[[i]] <- (movement) 
for (t in seq(1, length(holder))){ 
    if (holder[t] == holder[t-1]) 
    changes <- 0 
    else if (holder[t] != holder[t-1]) 
    changes <- 1 

我目前正在此錯誤:錯誤在保持器[[噸 - 1]]:嘗試多於一個的元件選擇以下

爲以下代碼:

holder <- list(movement) 
for (t in length(holder)){ 
    if (holder[[t]] == holder[[t-1]]) 
    changes <- 0 
    else changes <- 1 
+0

是不是你的問題解決[這裏](http://stackoverflow.com/questions/32903733/for-loop-where-criteria-is-last-data-record-in-r)? – Cath

+0

嗨。是的,最初的問題解決了。我已經嘗試過並在代碼的主體中嘗試過,並且由於某種原因它只是打印出一系列的1?我認爲這可能是因爲我將以前的數據存儲在列表中,但無法確定。 – PharmR

+0

你能分享一段你的數據嗎?我們不知道你正在處理的對象的結構。也可能使用什麼特定的庫 – erasmortg

回答

2

這是太長了評論,所以我把這作爲答案(實際上它可能會回答你的問題):

正如我已經在您的上一個問題的評論中提到的,你應該看看什麼是seq(1, length(holder))等等,當你放if (t == t-1)時你在做什麼:你正在做的事情如「if 1 == 0」,它不能爲TRUE。

您需要使用循環的「第二個版本」(或者實際上沒有循環...),它比較正確的東西,但holderlist,所以您需要將其定義爲一個載體或使用雙括號(holder[[t]])。

你並不需要另一個ifelse(你實際上是「說」,以R爲「如果A爲真,那麼做一些事情,否則,如果‘相反A’爲真,那麼做別的事情」,但是,不一定,如果A不是TRUE,那麼'A'就是......
因此,像:

for (t in seq(length(holder))){ 
    if (holder[[t]] == holder[[t-1]]) changes <- 0 else changes <- 1 
} 

請考慮對答案花一些時間從以前的問題,瞭解您的解決方案沒有奏效,爲什麼提供的答案一樣。 (這包括閱讀不同功能的文檔,並查看變量可以採用的值,例如運行循環,每次一個「轉動」)。

+0

謝謝你。出於某種原因,我現在得到:持有者[[t]]中的錯誤:下標越界 – PharmR

+0

@HoffiCoffi,可能是因爲在某個時間點't'不在範圍內(1,長度(持有者))。當你收到此消息錯誤時檢查't'的值,它可能會給你原因 – Cath