2012-06-24 4 views
1

UPDATE см нижеВозврат объект из времени цикла

Я не уверен, как заполнить список или вектор с элементами в цикле в то время, когда нет счетчика/итератора индекса по. Ниже приведен минимальный пример. У меня более сложный цикл while, который, как и foo ниже, имеет логический оператор, который не включает число, поэтому мне не ясно, как заполнить список vec с помощью x. Возможно ли создать какой-то итератор в цикле while, чтобы каждый раз, когда вы проходили цикл while, итератор просто увеличивался на единицу? Я мог бы использовать этот итератор для индексации списка vec?

foo <- function(){ 
    names <- list("a","b","c") 
    vec <- list() 
    more <- TRUE 
    while(more == TRUE){ 
    names <- rep(names, 2) 
    if(length(names) < 50) vec <- names 
    more <- length(names) < 50 
    } 
    vec 
} 

foo() 

Спасибо, это, кажется, работает, как мне хотелось прямо сейчас:

foo <- function(){ 
    names <- list("a","b","c") 
    i <- 0 
    vec <- list() 
    more <- TRUE 
    while(more == TRUE){ 
    i <- i + 1 
    names <- rep(names, 2) 
    if(length(names) < 50) vec[[i]] <- names 
    more <- length(names) < 50 
    } 
vec 
} 

foo() 
+0

Также, что это связано с возвратом объекта из цикла while? – Dason

+0

О, у меня возникла проблема с возвратом объекта из цикла while, который вложен в функцию. Например, я не мог вернуть vec выше из функции foo. Но я думаю, что это исправляет это. – sckott

ответ

1

Используя подход, где вы построить свой собственный итератор очень легко. Вот несколько примеров кода, который печатает цифры от 1 до 10 в том, что могло бы быть меньше R, как способ для выполнения этой задачи:

i <- 0 
more <- TRUE 
while(more == TRUE){ 
    i <- i + 1 
    print(i) 
    if(i == 10){ 
     more <- FALSE 
    } 
} 

Как вы можете видеть, что это в значительной степени так же, как вы описали. Вы просто увеличиваете итератор в верхней части цикла.

+0

Спасибо, обновлено выше и работает так, как я хотел. – sckott

+0

Я всегда нахожу 'if (foo == TRUE)' или 'while (foo == TRUE)' забавный. Меня учили писать код, подобный этому, в VB несколько лет назад, и я продолжал писать все мои 'if' таким образом, пока однажды не понял, что если (foo)' было одинаково ... :) –

+0

Я согласен, что не включая дополнительный «== ИСТИНА» - это лучший стиль. Хотя они не совсем то же самое. Например, используя дополнительную проверку, если по какой-либо причине, если вы хотите вместо 'more <- FALSE', вы можете сделать что-то вроде' more <- "some_output_diagnostics", и он все равно выйдет из цикла. Ужасный стиль, но это не совсем то же самое, и если вы не выполнили другую проверку, это приведет к ошибке вместо выхода из цикла. – Dason

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