r-如何捕获整数(0)



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

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

捕捉这种病毒最安全的方法是什么?

这是R打印零长度矢量(整数1)的方法,因此您可以测试长度为0:的a

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'") 

您可以轻松捕获函数相同(x,y)的整数(0)

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(如果您在tidyverse中工作,则很有用)

当通过library(tidyverse)附加tidyverse时,rlang命名空间似乎没有被附加——在这种情况下,您使用的是purrr::is_empty,它只是从rlang包中导入的。

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

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

isEmpty()包含在S4Vectors基本包中。无需加载任何其他包。

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

相关内容

  • 没有找到相关文章

最新更新