R 不一致行为
考虑以下几点:R 不一致行为,r,R,考虑以下几点: seq(from=10,to=30)[c(4,8)] [1] 13 17 seq(from=10,to=30)[c(NA,8)] [1] NA 17 seq(from=10,to=30)[c(NA,NA)] [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 对我来说,后者的结果与R处理其他两个示例的方式不一致,并且花费了我相当不愉快的调试痛苦 这可能被认为是一个bug吗?不确定它是否是bug
seq(from=10,to=30)[c(4,8)]
[1] 13 17
seq(from=10,to=30)[c(NA,8)]
[1] NA 17
seq(from=10,to=30)[c(NA,NA)]
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
对我来说,后者的结果与R处理其他两个示例的方式不一致,并且花费了我相当不愉快的调试痛苦
这可能被认为是一个bug吗?不确定它是否是bug-我怀疑这取决于您的观点,但这是索引工作原理的一个微妙之处。快速解决方案是将第三个示例更改为:
seq(from=10,to=30)[as.numeric(c(NA,NA))]
原因是c(NA,NA)
是一个逻辑向量,因此使用逻辑子集(包括循环向量),而至少有一个非NA会导致向量提升为整数向量。同样,这可以通过以下方式实现:
seq(from=10,to=30)[c(NA_integer_,NA_integer_)]
如果您不熟悉索引,请参见
?”['
,了解索引的详细信息。一个错误,没有。seq(10,30)
没有一个是NA
[
是一个提取函数。您试图提取的NA
在序列中不存在。请尝试seq(from=10,to=30)[c(TRUE,FALSE)]
看看你得到了什么。或者试着(10:30)[NA]
看看你得到了什么。R
关于处理NA
的规则非常明确,事实上是一致的。我不明白。(10:30)[c(NA,8)]
可能会被解释为:“返回‘不适用’和第8个元素”,那么为什么呢“两次返回‘不适用’元素”不返回c(NA,NA)
?这非常清楚-我没有意识到子集向量的类型差异,并且一直认为NA
是一种中性类型。非常感谢。