【问题标题】:Having trouble with nested loops (R)嵌套循环有问题 (R)
【发布时间】:2021-01-22 15:56:38
【问题描述】:

我编写了这个嵌套循环,以便在内循环中,代码贯穿第一行;然后,外层更新循环以允许内层运行通过第二行(依此类推)。数据来自矩阵“supergerador”。 “rodadas”是行大小,“n”是列大小。 “vec”是感兴趣的向量。提前谢谢!

编辑:i, j 最初被分配 i = 1, j = 2

for(e in 1:rodadas) {
  for(f in 1:(n-1)) {
    if(j >= 10) {
      vec[f] = min(supergerador[i, j] - supergerador[i, j - 1], 1 - supergerador[i, j])
    }
    else {
    vec[f] = func(i, j)
    }
    j = j + 1
  }
  i = i + 1
}

func 定义为

func = function(i, j) {
  minf = min(supergerador[i, j] - supergerador[i, j - 1], supergerador[i, j + 1] - supergerador[i, j])
  return(minf)
}

作为参考,这是嵌套循环返回的内容。你可以说它只经过了一行。

> vec
[1] 0.127387378 0.068119707 0.043472981 0.043472981 0.027431603 0.027431603
[7] 0.015739046 0.008010766 0.008010766

【问题讨论】:

  • 循环的第一次迭代后,您不会重置“i”或“j”的值。您的示例是通过递增“i”或“j”而不使用循环索引“e”和“f”来进行不良编程实践。
  • 您的循环遍历了所有行,但您每次都通过内部循环重写vec。内部循环重新开始分配vec[f]f = 1, 2, ..., n-1
  • 我对编程真的很陌生,所以我仍然不知道什么是好的和坏的做法,不幸的是。使用您的输入,我设法将嵌套循环简化为: for(i in 1:rodadas) { for(j in 1:(n-1)) { vec[j] = func(i, j) }但是,它仍然只注册第一行。我理解你在第二条评论中所说的,但我不知道如何实现它。
  • 我尝试将 vec[i] = func(i, j) 切换为 vec[j] = func(i, j)。它确实会产生大量的数据。这个修改有意义吗?

标签: r nested-loops


【解决方案1】:

我不太确定您打算在这里做什么,但这里有一些建议和代码编辑:

建议:

  1. 如果您有一个 for 循环,请为您的子集使用循环索引(尽可能合理),并在合理的情况下避免使用其他索引。
    • 这可避免在索引应重置但未重置时出现代码混乱和不可预见的错误。
  2. 尽可能避免使用双重子集变量。例如,如果您多次调用 x[i, j],请将其存储在一个变量中,然后在结果中使用此变量。
  3. 单行函数很好,但应该增加代码的可读性。否则,从效率的角度来看,内联代码是最佳选择。

我相信您正在寻找将这些合并到您的代码中

for(i in 1:rodadas) {
  for(j in 2:n) {
    x1 = supergerador[i, j]
    x2 = supergerador[i, j - 1]
    if(j >= 10) {
      vec[f] = min(x1 - x2, 1 - x1)
    }
    else {
      vec[f] = min(x1 - x2, supergerador[i, j + 1] - x1)
    }
  }
}

在这里,我假设您希望循环遍历每一行的列,直到 rodadas

一旦您对 R 更加熟悉,您应该研究一下向量化。对您的问题有了更多了解,我们应该可以很容易地矢量化您的第二个 for 循环,删除您的 if 语句并在 1 次快速扫描中执行计算。但在此之前,这是开始您的编程体验的好地方,并且对 for-loops 有深入的了解对于任何语言都至关重要。

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 2016-06-06
    • 2015-01-19
    • 2021-05-17
    • 2021-12-01
    • 2017-09-20
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多