2016-11-14 3 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's 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 использование длины (y) +1 также решает проблему и фиксирует то, что я пытаюсь сказать: избегайте хранения нулевых значений в одном и том же синтаксисе цикла. Я попытаюсь отредактировать ответ, чтобы быть более явным с этим.У меня нет фона в формальном программировании, но основное намерение заключается в том, как решить эту проблему с самой структурой цикла –

Смежные вопросы