r - 嵌套循环有问题 (R)
问题描述
我编写了这个嵌套循环,以便在内部循环中,代码贯穿第一行;然后,外层更新循环以允许内层运行通过第二行(依此类推)。数据来自矩阵“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
解决方案
我不太确定您打算在这里做什么,但这里有一些建议和代码编辑:
建议:
- 如果您有一个 for 循环,请为您的子集使用循环索引(尽可能合理),并在合理的情况下避免使用其他索引。
- 当索引应该被重置但没有被重置时,这可以避免代码混乱和不可预见的错误。
- 尽可能避免双重子集变量。例如,如果您多次调用
x[i, j]
,请将其存储在变量中,然后在结果中使用此变量。 - 单行函数很好,但应该增加代码的可读性。否则,从效率的角度来看,内联代码是最佳的。
将这些合并到您的代码中,我相信您正在寻找
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
对任何语言都有深刻的理解是至关重要的。
推荐阅读
- ios - 从设备所有者那里获取联系人
- c - C:如何将文件的大量整数读入足够大的数组?
- qt - QML 中的抽屉动画
- google-sheets - 根据小于 100 的小数增加一个数字(第 2 部分)
- javascript - 使用多个嵌套函数和 for 循环处理回调?
- google-apps-script - 您如何在 Google 表格的 A 列中找到最后使用的行
- java - 使用 ComputeIfAbsent 和 ComputeIfPresent 将列表放入地图
- asp.net-core - .NET Core 3.1 通用主机实现中的 ConfigureContainer
- rust - 如何有效地处理 rust 中具有不同具体类型的泛型类型?
- javascript - 倒数计时器没有接收到值输入?