2012-06-24 103 views
1

UPDATE見下文從while循環

返回的對象,我不知道如何在沒有計數器/迭代通過索引填充在一個while循環元素的列表或載體。見下面最小的例子。我有一個更復雜的while循環,就像下面的foo一樣,它有一個不包含數字的邏輯語句,所以我不清楚如何用x填充vec列表。是否有可能在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循環返回對象的問題。例如,我不能從函數foo返回上面的vec。但我認爲上述修復了這一點。 – sckott

回答

1

使用,你構建自己的迭代器是很容易的辦法。下面是在什麼可能是這樣的方式至少R鍵完成這個任務打印數字1到10的一些示例代碼:

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',直到有一天我突然意識到'if(foo)'是一樣的...... :) –

+0

我同意不包括額外的「== TRUE」是更好的風格。雖然他們不完全一樣。例如,如果出於某種原因使用額外的檢查,如果你想代替'more < - FALSE',你可以執行'more < - 「some_output_diagnostics」'這樣的操作,它仍然會退出循環。可怕的風格,但它不完全相同,如果你沒有做其他檢查它會導致一個錯誤,而不是退出循環。 – Dason