4

我尝试在 R 中为不同的参数值 a 和 b 计算一些东西,其中我的参数 b 总是应该小于或等于 a。为此,我创建了两个循环,其中我将 a(从 0 到 4)和 b 从 0 变为 a,但 R 得到了奇怪的 b 值。

v=c()
L<-0
for (a in seq(0, 4, length.out=41)){
  for (b in seq(0, a, length.out=(10*a+1))){
    L<-L+1
    v[L]<-b
  }
}
v

在我看来,b 应该始终以 0.1 步从 0 运行到 a。但并非总是如此,有时步长更小,如向量 v 的位置 23-28 所示(例如)。有谁知道为什么会这样。我找不到错误!谢谢!

4

3 回答 3

6

seq注释的文档length.out将四舍五入。由于a是数字,因此与一些错误相关联,因此可能会得到比您预期的多 1 的长度,这会给您带来奇怪的输出。

for (a in seq(0, 4, length.out=41)[1:7]){
  print(paste(as.integer(10*a+1), ceiling(10*a+1)))
}
# [1] "1 1"
# [1] "2 2"
# [1] "3 3"
# [1] "4 4"
# [1] "5 5"
# [1] "6 6"
# [1] "7 8"

注意最后一行:你得到的是 8 而不是 7。

要解决这个问题,请尝试通过四舍五入将长度转换为整数:

for (b in seq(0, a, length.out=round(10*a+1))){
于 2013-07-19T13:41:11.503 回答
3

老式的做法有什么问题?

v=c()
L<-0
for (a in 0:40){
    for (b in 0:a){
    L<-L+1
    v[L]<-b/10
  }
}
v
于 2013-07-19T14:18:43.200 回答
1

要添加到 Peyton 的答案,您可以在这里看到您实际得到的内容:

print(seq(0,4,length.out=41)[7],digits=16)

因为这个数字的 10 倍大于 6,所以它向上舍入到 7 并加 1。

为您提供 0.1 步骤的更清洁的替代方法是使用by

v=c()
L<-0
for (a in seq(0, 4, by=0.1)){
  for (b in seq(0, a, by=0.1)){
    L<-L+1
    v[L]<-b
  }
}
v

或者更清洁的仍然可能是:

a <- 0:40
out <- list()
for(i in seq(along=a)) out[[i]] <- 0:a[i]
v <- unlist(out)/10
于 2013-07-19T13:49:17.227 回答