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
我正在尝试获取 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