2014-01-19 93 views
0

我知道這是一個非常基本的問題,但我認爲我在語法上有困難。 我正在做一個while循環,我想稍後使用結果。但是,我不知道如何將結果存儲在列表中。如何在列表中存儲while循環的結果?

這是我試圖做的while循環的「簡短版本」。

z <- 0 
while(z < 10) { 
    z <- z + 1 
    print(z) 
} 

如何將此while循環的結果存儲在列表中?

謝謝!

+0

'while'循環是非常unidiomatic在R.如果我需要一個一年往往一次。所以,無論你想要做什麼,都可能有更好的(更有效的)選擇。 – Roland

回答

-1

也許這有助於

z <- 0 
res <- c() 
while(z<10) { 
    z <- z+1 
    res <- c(res, z) 
} 

結果是一個向量,而不是一個名單,雖然。而這個實現效率很低。 如果您知道迭代的次數,請按照@Dason和@Martin Morgan的指示進行預分配。

+0

謝謝!這有幫助! – user3212269

+3

請注意,這是一個很糟糕的做法,但以這種方式增長矢量的速度可能會非常慢。如果您提前知道結果長度,最好在循環前分配結果向量,然後將其填入。但是真的有更好的方法來做這種事情在R. – Dason

1
listy <- list() 
z <- 0 
while(z < 10) { 
z <- z + 1 
listy[z] <- z 

print(z) 
} 
> listy 
[[1]] 
[1] 1 

[[2]] 
[1] 2 

[[3]] 
[1] 3 

[[4]] 
[1] 4 

[[5]] 
[1] 5 

[[6]] 
[1] 6 

[[7]] 
[1] 7 

[[8]] 
[1] 8 

[[9]] 
[1] 9 

[[10]] 
[1] 10 
+1

是的,這看起來像我在找什麼! – user3212269

+0

太好了。那麼如果'是這種情況,那麼你應該將其標記爲已接受來關閉該問題:) – cianius

-1

你正在學什麼語言?

Java示例:

int List<String> = new List<>(); 

while(z < 10) { List.add(z); z++ } 
+3

他說他使用R – cianius

4

將R答案都令人失望,他們使用令人恐懼的「複製並追加」的格局,帕特里克的第二章燒傷的R Inferno。問題是,這使得n *(n-1)/ 2個元素的副本隨着矢量強制增長而增加。第一個改進是預先分配和填充,第二個是讓R用lapply(list)或vapply(vector)管理事情,第三個是使用實現所需操作的「向量化」函數。

這裏有一些不好的實現

f1 <- function(n) { 
    ## BAD, copy and append 
    res <- c() 
    for (i in seq_len(n)) 
     res <- c(res, i) 
    res 
} 
f2 <- function(n) { 
    ## BAD, copy and append 
    res <- c() 
    for (i in seq_len(n)) 
     res[[i]] <- i 
    res 
} 
f3 <- function(n) { 
    ## BAD copy and append 
    res <- c() 
    i <- 0 
    while (i < n) { 
     i <- i + 1 
     res <- c(res, i) 
    } 
} 

和更好的實現,仍然需要用戶來管理結果

f4 <- function(n) { 
    ## better, pre-allocate and fill 
    res <- integer(n) 
    for (i in seq_len(n)) 
     res[[i]] <- i 
    res 
} 

然後實現,允許R做的所有工作

f5 <- function(n) 
    ## better, lapply manages allocation 
    sapply(seq_len(n), function(i) i) 
f6 <- function(n) 
    ## better, vapply manages allocation and enforces return type 
    vapply(seq_len(n), function(i) i, integer(1)) 

這是一些時間

library(microbenchmark) 
n <- 100 
microbenchmark(f1(n), f2(n), f3(n), f4(n), f5(n), f6(n)) 
## Unit: microseconds 
## expr  min  lq median  uq  max neval 
## f1(n) 68.857 74.3045 75.5995 76.6050 87.270 100 
## f2(n) 180.174 185.1460 187.1960 191.0030 221.571 100 
## f3(n) 141.022 146.0605 148.0615 151.0435 184.322 100 
## f4(n) 116.976 122.0740 124.8700 127.4540 166.803 100 
## f5(n) 214.319 219.9760 223.4540 227.5000 294.203 100 
## f6(n) 91.871 94.3685 95.4235 96.8335 126.893 100 
n <- 10000 
microbenchmark(f1(n), f2(n), f3(n), f4(n), f5(n), f6(n), times=10) 
## Unit: milliseconds 
## expr  min   lq  median   uq  max neval 
## f1(n) 226.239815 227.871791 229.115319 232.963898 274.052546 10 
## f2(n) 134.979884 135.509744 136.726051 137.707050 152.690075 10 
## f3(n) 185.598667 187.437479 189.442674 210.786491 333.767094 10 
## f4(n) 11.523032 11.676948 11.777627 11.864006 12.099091 10 
## f5(n) 14.670557 14.808911 15.041665 15.158167 15.675638 10 
## f6(n) 8.295519 8.401100 8.424139 8.525598 10.374145 10 

當然對於這個特殊的例子有一個「量化」的解決方案,還要更快

microbenchmark(f6(n), seq_len(n), times=10) 
## Unit: microseconds 
##  expr  min  lq median  uq  max neval 
##  f6(n) 8240.384 9518.9940 9561.2310 9649.877 11427.134 100 
## seq_len(n) 20.624 20.9535 22.0295 22.892 34.461 100