我知道在 R 中使用 for 循环通常是不必要的,因为它支持向量化。我希望编程尽可能高效,这是我关于以下示例代码的问题。
我有一个六边形网格,我正在计算单元格的数量,在我的示例中,从左下角开始,向右计数,从 1 到 225。因此,单元格 16 放置在单元格 1 正上方稍有一点偏移的位置。 查看快照:
因此,如果我有 Y 坐标,则 X 坐标必须是四舍五入或上限。在我的应用程序中,用户指出单元格,我将其保存并在 for 循环中遍历单元格以确定他选择的单元格,如下所示,其中包含用户可能选择的 Xcells 和 Ycells 的玩具输入值:
gridsize <- 15
Xcells <-c(0.8066765, 1.8209879, 3.0526517, 0.5893240)
Ycells <-c(0.4577802, 0.4577802, 0.5302311, 1.5445425)
clicks <- length(Xcells)
cells <-vector('list', clicks)
这对应于单元格 1 2 3 和 16. 4 次点击。现在确定细胞数量:
Y <- ceiling(Ycells)
for(i in 1:clicks){
if(Y[i]%%2==1){
X[i] <- round(Xcells[i])
}
else{
X[i]<- ceiling(Xcells[i])
}
#determine the cell numbers and store in predefined list
cells[[i]] <- (Y[i]-1)*gridsize + X[i]
}
因此,如果 Y 为“偶数”,则 X 必须四舍五入,如果 Y 为“非偶数”,则必须为上限值。
有没有办法通过使用矢量化来实现这一点,无需 for 循环?
最佳答案
您可以按如下方式对其进行矢量化
(Y - 1) * gridsize + ifelse(Y %% 2 == 1, round(Xcells), ceiling(Xcells))
# [1] 1 2 3 16
(我不确定预先计算 round(Xcells)
和 ceiling(Xcells)
是否会进一步改善这一点 - 您可以尝试)
另一个选择(如果你想避免ifelse
)可能是
(Y - 1) * gridsize + cbind(ceiling(Xcells), round(Xcells))[cbind(1:length(Xcells), Y %% 2 + 1)]
# [1] 1 2 3 16
关于r - 六边形网格中细胞数量的矢量化计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39739316/