是否可以区分 `switch` 中的 NA_character_ 和 "NA"?

Is it possible to distinguish between NA_character_ and "NA" in `switch`?

中,回答者表明在switch中使用`NA`会匹配缺失值。但是,"NA" 也匹配。我有一个包含字符串 "NA" 和缺失值 NA 的字符向量。我将这个向量的元素一个一个地传递给 switch,但无法区分两者

for (k in c(NA, "NA")) {
  cat(switch(k, "NA_character_" = "C", "NA" = "B", `NA` = "A"))
}

#> BB

for (k in c(NA, "NA")) {
  cat(switch(k, "NA_character_" = "C", `NA` = "A", "NA" = "B"))
}

#> AA

我知道我可以使用if (is.na(k))来区分它们,但是使用switch的目的是限制嵌套的if ... else语句,所以我宁愿使用switch 如果只是在备选列表中选择正确名称的问题,则单独使用。我注意到帮助文件说(我强调):

If EXPR evaluates to a character string then that string is matched (exactly) to the names of the elements in ...

所以我想知道"exactly equal to NA_character_"是否有适用于此的特定含义。

我们可以创建一个函数来区分这三种情况

f1 <- function(val){      
   switch(deparse(val),
      "NA_character_" = "C", 
       "NA" = "B", 
      '"NA"' = "A") 
 }

f1(NA)
[1] "B"
f1(NA_character_)
#[1] "C"
f1("NA")   
#[1] "A"

使用 OP 的循环

for(k in c(NA, "NA")) cat(f1(k), "\n")
#C
#A

在这种情况下,NA被视为NA_character_,因为它是一个字符向量。如果我们需要使用 as NA,那么将其保存在 list

for(k in list(NA, "NA")) cat(f1(k), "\n")
#B 
#A