2016-11-14 190 views
1

存在一種避免在激活某些條件以跳過下一次迭代時在迭代過程中存儲空值的方法?的「如何解決」的目的這個問題是結構本身循環避免在for循環中跳過迭代時存儲空值

[背景]:

我指的情況下,當你需要使用內部的存儲機制循環與條件語句一起使用,並給出基本上其中一條可能路徑不符合您感興趣的場景。爲了在這一時刻給予治療,而不是計算的後驗,你可以跳到下一次迭代。

[]

假設給定數字的某一序列,我感興趣的只是存儲的是大於2的列表的序列號。

storeGreaterThan2 <- function(x){ 
y <- list() 
    for (i in seq_along(x)) { 
     if (x[i] > 2) { 
      y[[i]] <- x[i] 
     } else { 
      next 
     } 
    } 
y 
} 

前面的功能處理的最終目的,但是當跳過反覆的條件被激活,在索引中缺少的操作充滿最終列表中的空值。

> storeGeaterThan2(1:5) 
[[1]] 
NULL 

[[2]] 
NULL 

[[3]] 
[1] 3 

[[4]] 
[1] 4 

[[5]] 
[1] 5 

在處理問題的循環,它可能如何處理與結構內部的精神?

+2

裏面你的循環使用索引長度(y)+1添加一個附加元素,如:y [[length(y)+1]] < - x [i]'。取決於你想要的結果,有幾種比使用for循環更好更快的方法。 – Dave2e

+0

這是一個很好的解決方案,可以解決同一個循環中NULL值的問題。 –

回答

1

這是一個很奇怪的例子,我不知道它是否是x-y problem。最好多說一說你的情況以及你最終想做什麼。例如,嘗試執行此操作的方法有所不同,具體取決於函數的輸入始終是遞增順序。 @ Dave2e的comment,在我看來,根據你真正所做的事情是否符合標準,會有更好的方式。無論如何,您可以在返回列表之前簡單地刪除NULL元素。試想一下:

storeGreaterThan2 <- function(x){ 
    y <- list() 
    for(i in seq_along(x)) { 
     if(x[i] > 2) { 
     y[[i]] <- x[i] 
     } else { 
     next 
     } 
    } 
    y <- y[-which(sapply(y, is.null))] 
    return(y) 
} 
storeGreaterThan2(1:5) 
# [[1]] 
# [1] 3 
# 
# [[2]] 
# [1] 4 
# 
# [[3]] 
# [1] 5 

這裏是一個可能的方式做到這一點而不必存儲在NULL元素,而不是清除它在最後:

storeGreaterThan2 <- function(x){ 
    y <- list() 
    l <- 1     # l is an index for the list 
    for(i in seq_along(x)){ # i is an index for the x vector 
    if(x[i] > 2) { 
     y[[l]] <- x[i] 
     l  <- l+1 
    } 
    } 
    return(y) 
} 
+0

這不是一個x-y問題@gung。我編輯我的答案給更多的上下文。 –

+0

@CristóbalAlcázar,夠公平的。將循環中的那個元素彈出是你正在尋找什麼?你願意使用不同的計數器來跟蹤列表中的元素與x的元素嗎? – gung

+0

你的答案解決了這個問題。在使用@Dave2e註釋的情況下,使用length(y)+1也可以解決問題,並捕獲我想說的內容:避免將空值存儲在相同的循環語法中。 我會嘗試編輯答案,以更明確地與此。我沒有正式編程背景,但問題的主要目的是如何處理循環結構本身的問題 –