Pracma::Lcm() 仅 returns NA 在循环中

Pracma::Lcm() only returns NA in loop

我正在尝试获取 1 到 20 之间素数的最小公倍数:

x <- expand.grid(c(2,3,7,11,13,17,19),c(2,3,7,11,13,17,19))
l <- c()
# loop
for(i in length(x[,1])){
l[i] <- pracma::Lcm(x[i, 1], x[i, 2])
}
# gives
tail(l)
[1] NA NA NA NA NA 19

有趣的是,循环 returns 除了第一个和最后一个值之外只有 NA,这没有意义,因为可以手动获取值:

pracma::Lcm(x[4, 1], x[4, 2])
[1] 22

谁能看出我遗漏了什么?

提前致谢!

我们可以启动 l 而不是 c()。此外,length 是单个值。我们需要 seq_len(nrow(x))

l <- numeric(nrow(x))

for(i in seq_len(nrow(x))) {
     l[i] <- pracma::Lcm(x[i, 1], x[i, 2])
 }

l
#[1]   2   6  14  22  26  34  38   6   3  21  33  39  51  57  14  21   7  77  91 119 133  22  33  77  11 143 187 209  26  39  91 143  13
#[34] 221 247  34  51 119 187 221  17 323  38  57 133 209 247 323  19

如果我们初始化为c(),那么在循环内部,它将是

 l <- c(l, pracma::Lcm(x[i, 1], x[i, 2]))

此外,pracma::Lcm 是向量化的,因此无需遍历每一行

pracma::Lcm(x[,1], x[,2])
#[1]   2   6  14  22  26  34  38   6   3  21  33  39  51  57  14  21   7  77  91 119 133  22  33  77  11 143 187 209  26  39  91 143  13
#[34] 221 247  34  51 119 187 221  17 323  38  57 133 209 247 323  19

在 OP 的代码中,

length(x[,1])
#[1] 49

是一个数字,即最后一行,这里,即只循环最后一行

第二个问题是在赋值过程中,我们用 length 0 赋值,当我们使用索引时,它正在创建一个 NULL

l <- c()
length(l)
#[1] 0
l[1]
#NULL