【问题标题】:For loop is returning only last valueFor 循环只返回最后一个值
【发布时间】:2020-02-17 19:04:35
【问题描述】:

对于下面的 for 循环,我可以看到所有值。但是当我为它分配新对象时,返回的值只是最后一个(参考最后一个代码)。任何人都可以在这里帮助我。是不是所有的值都可以通过赋值来显示?

for(i in 1:5)
+ {
+     for(j in 1:2)
+     {
+         print(i*j);
+     }
+ }

分配一个对象。

for(i in 1:5)
+ {
+     for(j in 1:2)
+     {
+         as <- i*j
+     }
+ }

【问题讨论】:

  • 您想在哪里存储所有值?虚拟变量as 只是一个标量,只能保存一个值。您在循环结束时看到的值仅反映了最终分配。
  • 感谢您的评论。我需要作为对象存储。

标签: r


【解决方案1】:

这是一种典型的 R 方法:

as.vector(seq(1:2)%*%t(seq(1:5)))

[1]  1  2  2  4  3  6  4  8  5 10

这种方法采用[1,2]t[1,2,3,4,5] 之间的点积积。它没有使用显式循环,而是使用向量来表示两个原始循环的边界。中间结果是一个矩阵,我们可以轻松地将其转换为列或行顺序的一维向量,具体取决于循环的边界。

【讨论】:

    【解决方案2】:

    for循环方法

    如果您想将新值附加到as,可以尝试将as 更新为as &lt;- c(as,i*j),它将i*j 与现有as 连接起来,并将结果分配给as,即,

    as <- c()
    for(i in 1:5)
    {
         for(j in 1:2)
         {
             as <- c(as,i*j)
         }
    }
    

    outer 接近

    实现相同目标的更有效方法是使用outer,即,

    as <- c(t(outer(1:5,1:2)))
    

    【讨论】:

    • 谢谢检查?
    • 请注意,此解决方案效率极低,应该以其他方式完成。
    • @Georgery 我添加了一个高效的解决方案
    • 谢谢大家。实际上我正在执行一些闪亮的测试,所以它需要在 for 循环下。让我看看解决方案?
    【解决方案3】:

    所以,for 循环在这里非常低效。你应该乘以向量。例如

     rep(1:5, each = 2)
    

    给你

    [1] 1 1 2 2 3 3 4 4 5 5
    

    如果你把它乘以

    1:2
    

    较短的向量被回收,你会得到这个:

    rep(1:5, each = 2) * 1:2
    [1]  1  2  2  4  3  6  4  8  5 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多