嵌套循环(R)遇到问题



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

编辑: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

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

建议:

  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语句并在一次快速扫描中执行计算。但在此之前,这是一个开始你的编程经验的好地方,对for-loops有深刻的理解对任何语言都是至关重要的。

最新更新