R中有两个相互交换的循环,结果很奇怪

时间:2013-07-19 13:27:05

标签: r loops

我尝试在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步到0.1步。但它并不总是,有时步数较小,如矢量v的位置23-28(例如)中所见。 有没有人知道为什么会这样。我找不到错误! 谢谢!

3 个答案:

答案 0 :(得分:6)

seq的文档指出length.out的值将被四舍五入。由于a是数字,因此与某些错误相关联,因此可能会获得比您预期更长的一个长度,从而为您提供奇怪的输出。

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))){

答案 1 :(得分:3)

老式的做法有什么问题?

v=c()
L<-0
for (a in 0:40){
    for (b in 0:a){
    L<-L+1
    v[L]<-b/10
  }
}
v

答案 2 :(得分:1)

要添加Peyton的答案,你可以看到你实际上在这里得到的东西:

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

因为该数字的10倍超过6,所以它最多为7并增加1。

使用by

的更简洁的替代方法是给您0.1的步骤
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