是否可以区分 `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
在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