将一个值与 null 进行比较。为什么这是真的?
Compare a value to null. Why is this true?
为什么是
isTRUE(NULL != 2)
[1] FALSE
我怎样才能收到 TRUE?
在我的真实情况下,我有变量,如果值不同,我想处理一些东西。但是,当一个值为 NULL 时,我不认为它们是不同的!
正如@Roland 指出的那样,我们不能直接对 NULL
对象执行任何逻辑操作。为了比较它们,我们可能需要对 is.null
执行额外的检查,然后执行逻辑比较。
我们可以使用 identical
来比较处理整数的值以及 NULL
。
identical(4, 2)
#FALSE
identical(NULL, 2)
#FALSE
identical(2, 2)
#TRUE
为了回答您问题的为什么部分:
将 NULL
与其他类型进行比较会得到 logical(0)
(即,长度为零的逻辑向量)。所以,
isTRUE(NULL != 2)
实际上是
isTRUE(logical(0))
即FALSE
。
为了比较可能有 NULL
值的值,您也可以这样做(使用短路逻辑运算符):
a <- 2
b <- 2
!is.null(a) && !is.null(b) && a==b
#[1] TRUE
a <- 3
b <- 2
!is.null(a) && !is.null(b) && a==b
#[1] FALSE
a <- 2
b <- NULL
!is.null(a) && !is.null(b) && a==b
#[1] FALSE
为什么是
isTRUE(NULL != 2)
[1] FALSE
我怎样才能收到 TRUE?
在我的真实情况下,我有变量,如果值不同,我想处理一些东西。但是,当一个值为 NULL 时,我不认为它们是不同的!
正如@Roland 指出的那样,我们不能直接对 NULL
对象执行任何逻辑操作。为了比较它们,我们可能需要对 is.null
执行额外的检查,然后执行逻辑比较。
我们可以使用 identical
来比较处理整数的值以及 NULL
。
identical(4, 2)
#FALSE
identical(NULL, 2)
#FALSE
identical(2, 2)
#TRUE
为了回答您问题的为什么部分:
将 NULL
与其他类型进行比较会得到 logical(0)
(即,长度为零的逻辑向量)。所以,
isTRUE(NULL != 2)
实际上是
isTRUE(logical(0))
即FALSE
。
为了比较可能有 NULL
值的值,您也可以这样做(使用短路逻辑运算符):
a <- 2
b <- 2
!is.null(a) && !is.null(b) && a==b
#[1] TRUE
a <- 3
b <- 2
!is.null(a) && !is.null(b) && a==b
#[1] FALSE
a <- 2
b <- NULL
!is.null(a) && !is.null(b) && a==b
#[1] FALSE