2017-10-06 142 views
1

我注意到R中foreachprint的行为。foreach以某种方式重复元素,但将结果赋值给变量“纠正”它。R的foreach和打印行为

> for (i in 1:3) {print(i+1)} 
[1] 2 
[1] 3 
[1] 4 
> foreach (i=1:3) %do% {print(i+1)} 
[1] 2 
[1] 3 
[1] 4 
[[1]] 
[1] 2 

[[2]] 
[1] 3 

[[3]] 

[1] 4 

> x<-foreach (i=1:3) %do% {print(i+1)} 
[1] 2 
[1] 3 
[1] 4 
> x 
[[1]] 
[1] 2 

[[2]] 
[1] 3 

[[3]] 
[1] 4 
> foreach (i=1:3, .combine=c) %do% {print(i+1)} 
[1] 2 
[1] 3 
[1] 4 
[1] 2 3 4 

> foreach (i=1:3) %do% {(i+1)} 
[[1]] 
[1] 2 

[[2]] 
[1] 3 

[[3]] 
[1] 4 

> x <-foreach (i=1:3) %do% {(i+1)} 
> x 
[[1]] 
[1] 2 

[[2]] 
[1] 3 

[[3]] 
[1] 4 

> x<-for (i in 1:3) {(i+1)} 
> x 
NULL 

此外,这使我带着简单的for最后一次测试。 for循环不输出结果,而foreach。 如果我想拿起从子句的结果,是有另一种专用的方式,而不是

> x <- NULL 
> for (i in 1:3) {x <- cbind(x,(i+1))} 
> x 
    [,1] [,2] [,3] 
[1,] 2 3 4 
+1

'foreach'默认返回一个列表。这与'lapply'是相同的行为。试试'lapply(1:4,print)'。阅读'?foreach'的* Value *部分进行讨论。 – lmo

+0

使用'for',必须手动完成,因为在运行之前知道'for'循环的长度,预先分配适当的对象并填充它。在这里,您可以执行'myVec < - integer (长度(1:3))'然后'为(我在1:3){print(i); myVec [i] < - i}'。当然,在更复杂的迭代器中,您可能必须构建一个单独的变量,从1到整个循环的长度递增。 – lmo

+0

谢谢@lmo。这回答了可变部分的结果分配。关于什么样的foreach + print似乎是重复的结果,而foreach本身并没有,对此有何评论? – Kenny

回答

1

从帮助页面,?foreach(强调):

foreach%do%/%dopar%运营商提供了一种循环结构,可将其视为标准for循环和lapply函数的混合。它看起来类似于for循环,它评估的是一个表达式而不是函数(如lapply),但它的目的是返回一个值(缺省为列表),而不是引起副作用

关于,链接到lapply,这也返回一个列表,观察模上面的代码:

lapply(1:3, print) 
[1] 1 
[1] 2 
[1] 3 
[[1]] 
[1] 1 

[[2]] 
[1] 2 

[[3]] 
[1] 3 

所以lapply环路打印在迭代的每个值,然后返回输入作为与foreach一样的列表。