在一些教程代码中,写成:
## Results vector
results <- numeric()
## Initialize start and end indices
start <- end <- 0
for(index in seq_along(vectors)) {
values <- vectors[[index]]
size <- length(values)
if(size > 0) {
start <- end + 1
end <- start + size - 1
results[start:end] <- values
}
}
为什么这有必要?为什么编码器不能`start&lt; - end&lt; - numeric()?
答案 0 :(得分:4)
tl; dr numeric()
与0
不同,它会生成长度为零的数字向量。为什么不试试看看会发生什么?
numeric()
相当于numeric(0)
,它会产生长度为零的(空)数字向量,而numeric(1)
会产生长度 - 1 用零填充的数字向量,即
identical(numeric(1),0)
是TRUE
。在我看来,x <- 0
(很多!)比x <- numeric(1)
更清晰。
至于为什么start
和end
需要初始化为零:
start
end
初始化为numeric()
而非0,那么当我们首次使用其值时会发生什么?我们第一次执行size>0
start <- end + 1
如果end
为numeric(0)
,那么start
也是numeric(0)
我无法准确解释为什么此操作的结果是这样定义,但来自?Arithmetic
:
二元运算符返回包含元素操作元素结果的向量。如果涉及零长度向量,则结果的长度为零。
然后
end <- start + size - 1
也会产生numeric(0)
和
results[start:end]
将给出
Error in start:end : argument of length 0