【问题标题】:R foreach and print behaviorR foreach 和打印行为
【发布时间】:2018-03-18 01:03:00
【问题描述】:

我注意到 R 中 foreachprint 的这种行为。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)。阅读 ?foreachValue 部分进行讨论。
  • 使用for,您必须手动执行,因为您在运行之前知道for 循环的长度,预先分配正确的对象并填写它。在这里,您可以做myVec &lt;- integer(length(1:3)) 然后for(i in 1:3) {print(i); myVec[i] &lt;- i}。当然,在更复杂的迭代器中,您可能必须构造一个从 1 到循环长度递增的单独变量。
  • 谢谢@lmo。这回答了变量部分的结果分配。关于什么 foreach+print 似乎是结果的重复而单独的 foreach 不是这样的事实,任何 cmets ?
  • 我不确定你的意思。您要求使用print 打印当前值。 foreach 的返回值是一个列表,如果您没有像接近末尾那样分配它,它会打印到屏幕上。试试我的lapply 示例。
  • 这回答了我的问题。谢谢。对两组打印感到困惑

标签: r for-loop printing foreach


【解决方案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 相同的方式将输入作为列表返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多