我有一个因素用作查找表。
condLookup = c(hotdog = "ketchup", ham = "mustard", popcorn = "salt", coffee = "cream")
这按预期工作 - 我输入了一个 3 向量并得到一个 3 向量:
condLookup[c("hotdog", "spinach", NA)]
hotdog <NA> <NA>
"ketchup" NA NA
这也是意料之中的,即使回报都是NA
:
condLookup[c(NA, "spinach")]
<NA> <NA>
NA NA
而这个:
condLookup["spinach"]
<NA>
NA
但后来这让我感到惊讶 - 我给出了一个原子 NA,或两个 NA,我得到了一个 4 NA 的命名向量。
condLookup[NA]
<NA> <NA> <NA> <NA>
NA NA NA NA
condLookup[c(NA, NA)]
<NA> <NA> <NA> <NA>
NA NA NA NA
显然,对于vector2 <- condLookup[vector1]
,除非vector1
中的每个元素都是NA,否则vector2
将与vector1
长度相同。 在这种情况下,vector2
的长度与condLookup
相同。 你能解释一下这种行为吗?
键入NA
值,并且类型很重要:c(NA,"spinach")
强制NA
字符,该字符不会被回收:
condLookup[NA]
## <NA> <NA> <NA> <NA>
## NA NA NA NA
condLookup[NA_character_]
## <NA>
## NA
默认的NA
类型是合乎逻辑的。 逻辑向量将被回收以匹配向量的长度,而字符向量将用于匹配向量的名称。从?[
:
字符向量将与对象的"名称"匹配
。"我"、"J"、"..."可以是合乎逻辑的 矢量,指示要选择的元素/切片。 这样的载体 必要时回收以匹配相应的范围。
除了@Ben的答案--recycling之外,?Extract
还显示以下语句:
- 空 ("( 和 NA 索引都不匹配任何名称,甚至不匹配空名称或缺失名称。如果任何对象没有名称或适当的暗名,则它们将被视为所有",因此不匹配任何内容。