【发布时间】:2018-03-18 01:03:00
【问题描述】:
我注意到 R 中 foreach 和 print 的这种行为。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 输出结果。
如果我想从 for 子句中获取结果,是否有另一种专用方法而不是
> x <- NULL
> for (i in 1:3) {x <- cbind(x,(i+1))}
> x
[,1] [,2] [,3]
[1,] 2 3 4
【问题讨论】:
-
foreach默认返回一个列表。这与lapply的行为相同。试试lapply(1:4, print)。阅读?foreach的 Value 部分进行讨论。 -
使用
for,您必须手动执行,因为您在运行之前知道for循环的长度,预先分配正确的对象并填写它。在这里,您可以做myVec <- integer(length(1:3))然后for(i in 1:3) {print(i); myVec[i] <- i}。当然,在更复杂的迭代器中,您可能必须构造一个从 1 到循环长度递增的单独变量。 -
谢谢@lmo。这回答了变量部分的结果分配。关于什么 foreach+print 似乎是结果的重复而单独的 foreach 不是这样的事实,任何 cmets ?
-
我不确定你的意思。您要求使用
print打印当前值。foreach的返回值是一个列表,如果您没有像接近末尾那样分配它,它会打印到屏幕上。试试我的lapply示例。 -
这回答了我的问题。谢谢。对两组打印感到困惑
标签: r for-loop printing foreach