如何捕捉整数(0) ?

假设我们有一个生成 integer(0)的语句,例如。

 a <- which(1:3 == 5)

最安全的方法是什么?

144026 次浏览

这是 R 打印零长度向量(一个整数向量)的方法,所以你可以测试 a的长度为0:

R> length(a)
[1] 0

您可能需要重新考虑用于识别所需 哪个元素的策略,但是如果没有进一步的具体细节,就很难提出替代策略。

如果它是特定的零长度 整数,那么您需要类似于

is.integer0 <- function(x)
{
is.integer(x) && length(x) == 0L
}

检查一下:

is.integer0(integer(0)) #TRUE
is.integer0(0L)         #FALSE
is.integer0(numeric(0)) #FALSE

也可以使用 assertive进行此操作。

library(assertive)
x <- integer(0)
assert_is_integer(x)
assert_is_empty(x)
x <- 0L
assert_is_integer(x)
assert_is_empty(x)
## Error: is_empty : x has length 1, not 0.
x <- numeric(0)
assert_is_integer(x)
assert_is_empty(x)
## Error: is_integer : x is not of class 'integer'; it has class 'numeric'.

也许跑题了,但是 R 提供了两个很好的、快速的和空感知的函数来减少逻辑向量—— anyall:

if(any(x=='dolphin')) stop("Told you, no mammals!")

受 Andrie 回答的启发,你可以使用 identical,避免任何属性问题,方法是使用它是对象类的空集,并将其与该类的一个元素组合在一起:

attr(a, "foo") <- "bar"


identical(1L, c(a, 1L))
#> [1] TRUE

或者更一般地说:

is.empty <- function(x, mode = NULL){
if (is.null(mode)) mode <- class(x)
identical(vector(mode, 1), c(x, vector(class(x), 1)))
}


b <- numeric(0)


is.empty(a)
#> [1] TRUE
is.empty(a,"numeric")
#> [1] FALSE
is.empty(b)
#> [1] TRUE
is.empty(b,"integer")
#> [1] FALSE
if ( length(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'")
#[1] "nothing returned for 'a'"

转念一想,我觉得任何东西都比 length(.)更美:

 if ( any(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'")
if ( any(a <- 1:3 == 5 ) ) print(a)  else print("nothing returned for 'a'")

isEmpty()包含在 S4Vector 基础包中,不需要加载任何其他包。

a <- which(1:3 == 5)
isEmpty(a)
# [1] TRUE

您可以很容易地捕获整数(0)与函数相同(x,y)

x = integer(0)
identical(x, integer(0))
[1] TRUE


foo = function(x){identical(x, integer(0))}
foo(x)
[1] TRUE


foo(0)
[1] FALSE

另一个选项是 rlang::is_empty(如果你在整流宇宙中工作,这个选项很有用)

当通过 library(tidyverse)附加 tidyverse 时,rlang 名称空间似乎没有附加——在本例中,您使用的是 purrr::is_empty,它是从 rlang包导入的。

顺便说一下,rlang::is_empty使用 用户 Gavin 的方法

rlang::is_empty(which(1:3 == 5))
#> [1] TRUE