嵌套 for 循环跳过循环
Nested for-loop skips loops
这是我的问题:
我有一个网格(见下图),我需要获取每个块(单元格)的每个顶点的坐标并将其存储在列表中。我需要的块顺序是“1-1”、...“4-1”、“1-2”、...“4-2”。为了简单起见,我现在只使用索引。
基于两个具有共同东坐标和北坐标的向量,我编写了一个小函数,它可以部分生成我需要的输出。它正在跳过单元格“1-2”和“2-2”(见下面的输出)。我看不出错误到底在哪里,但我怀疑问题出在我的嵌套 for 循环中。 (有很多关于for循环的问题,但是none帮助我解决了我的问题)。
如果这太基础而无法在这里提出任何帮助,我们将不胜感激并表示歉意。
向量:
x.breaks <- c(191789.1, 291789.1, 391789.1)
y.breaks <- c(5172287, 5272287, 5372287, 5472287, 5572287)
函数:
getting_vertices <- function(x.breaks, y.breaks){
xs <- list()
ys <- list()
polys <- list()
for(i in 1 : (length(x.breaks)-1)){
xs[[i]] <- c(i, i+1 , i+1, i, i)
}
for(j in 1 : (length(y.breaks)-1)){
ys[[j]] <- c(j, j, j+1, j+1, j)
}
for(v in 1 : length(sapply(ys, length)) ){
for(k in 1: length(sapply(xs, length))){
polys[[v*k]] <- cbind(xs[[k]], ys[[v]])
}
}
return(polys)
}
getting_vertices(x.breaks, y.breaks)
输出(部分正确):
[[1]]
[,1] [,2]
[1,] 1 1
[2,] 2 1
[3,] 2 2
[4,] 1 2
[5,] 1 1
[[2]]
[,1] [,2]
[1,] 1 2
[2,] 2 2
[3,] 2 3
[4,] 1 3
[5,] 1 2
[[3]]
[,1] [,2]
[1,] 1 3
[2,] 2 3
[3,] 2 4
[4,] 1 4
[5,] 1 3
[[4]]
[,1] [,2]
[1,] 1 4
[2,] 2 4
[3,] 2 5
[4,] 1 5
[5,] 1 4
[[5]]
NULL
[[6]]
[,1] [,2]
[1,] 2 3
[2,] 3 3
[3,] 3 4
[4,] 2 4
[5,] 2 3
[[7]]
NULL
[[8]]
[,1] [,2]
[1,] 2 4
[2,] 3 4
[3,] 3 5
[4,] 2 5
[5,] 2 4
polys[[v*k]] <- ...
行后面的逻辑不正确,例如v=2,k=1会覆盖v=1,k=2。没有构成 5 或 7 的 v 和 k 的组合,因此这些条目为空。
我想你是想写这样的东西:
polys[[v+(k-1)*(length(ys))]] <- ...
要么
polys[[k+(v-1)*(length(xs))]] <- ...
取决于您希望结果的顺序
这是我的问题:
我有一个网格(见下图),我需要获取每个块(单元格)的每个顶点的坐标并将其存储在列表中。我需要的块顺序是“1-1”、...“4-1”、“1-2”、...“4-2”。为了简单起见,我现在只使用索引。
基于两个具有共同东坐标和北坐标的向量,我编写了一个小函数,它可以部分生成我需要的输出。它正在跳过单元格“1-2”和“2-2”(见下面的输出)。我看不出错误到底在哪里,但我怀疑问题出在我的嵌套 for 循环中。 (有很多关于for循环的问题,但是none帮助我解决了我的问题)。
如果这太基础而无法在这里提出任何帮助,我们将不胜感激并表示歉意。
向量:
x.breaks <- c(191789.1, 291789.1, 391789.1)
y.breaks <- c(5172287, 5272287, 5372287, 5472287, 5572287)
函数:
getting_vertices <- function(x.breaks, y.breaks){
xs <- list()
ys <- list()
polys <- list()
for(i in 1 : (length(x.breaks)-1)){
xs[[i]] <- c(i, i+1 , i+1, i, i)
}
for(j in 1 : (length(y.breaks)-1)){
ys[[j]] <- c(j, j, j+1, j+1, j)
}
for(v in 1 : length(sapply(ys, length)) ){
for(k in 1: length(sapply(xs, length))){
polys[[v*k]] <- cbind(xs[[k]], ys[[v]])
}
}
return(polys)
}
getting_vertices(x.breaks, y.breaks)
输出(部分正确):
[[1]]
[,1] [,2]
[1,] 1 1
[2,] 2 1
[3,] 2 2
[4,] 1 2
[5,] 1 1
[[2]]
[,1] [,2]
[1,] 1 2
[2,] 2 2
[3,] 2 3
[4,] 1 3
[5,] 1 2
[[3]]
[,1] [,2]
[1,] 1 3
[2,] 2 3
[3,] 2 4
[4,] 1 4
[5,] 1 3
[[4]]
[,1] [,2]
[1,] 1 4
[2,] 2 4
[3,] 2 5
[4,] 1 5
[5,] 1 4
[[5]]
NULL
[[6]]
[,1] [,2]
[1,] 2 3
[2,] 3 3
[3,] 3 4
[4,] 2 4
[5,] 2 3
[[7]]
NULL
[[8]]
[,1] [,2]
[1,] 2 4
[2,] 3 4
[3,] 3 5
[4,] 2 5
[5,] 2 4
polys[[v*k]] <- ...
行后面的逻辑不正确,例如v=2,k=1会覆盖v=1,k=2。没有构成 5 或 7 的 v 和 k 的组合,因此这些条目为空。
我想你是想写这样的东西:
polys[[v+(k-1)*(length(ys))]] <- ...
要么
polys[[k+(v-1)*(length(xs))]] <- ...
取决于您希望结果的顺序