我最近看到一个我不明白的问题。你有:
x <- c(1,2,3,4,45,654,3,NA," ",8,5,64,54)
||
中的r
条件不符合我的利益:识别NAs和空白:
if(is.na(x) || x==" ") {...}
我希望if
函数返回TRUE
,但它会FALSE
。有人可以帮我理解这个问题吗?谢谢!
编辑:
很抱歉,我打算在if
语句中使用该参数,因此长度应为1. |
不适用于此。
答案 0 :(得分:5)
请注意,||
的两边都是向量
x <- c(1,2,3,4,45,654,3,NA," ",8,5,64,54)
is.na(x)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x == " "
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
如果任何一方是矢量,那么它只使用它的第一个元素
is.na(x) || x == " "
## [1] FALSE
与:
相同is.na(x)[1] || (x == " ")[1]
## [1] FALSE
||
的双方都在上面一行FALSE
。
如果您要确定任何元素是NA
还是" "
那么
anyNA(x) || ( " " %in% x )
## [1] TRUE
您也可以使用any(x == " ")
作为右侧,但这只有效,因为我们知道如果由于左侧有任何NA
值,右侧将不会被执行如果左侧是||
(短路),则||
永远不会运行TRUE
的右侧。如果x
完全NA
,则any(x == " ")
将等于NA
而不是TRUE
或FALSE
,这会使NA
成为|
左手边重要。
(注意|
是不同的。它不会短路。在执行brew install libmagic
之前评估双方。)