我尝试在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(例如)中所见。 有没有人知道为什么会这样。我找不到错误! 谢谢!
答案 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
:
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