R 如何捕获整数(0)?

R 如何捕获整数(0)?,r,error-handling,integer,try-catch,R,Error Handling,Integer,Try Catch,假设我们有一个语句生成整数(0),例如 a <- which(1:3 == 5) a这是R打印零长度向量(整数向量)的方法,因此您可以测试长度为0的a: R> length(a) [1] 0 也许有必要重新考虑您用于确定所需元素的策略,但如果没有进一步的具体细节,则很难提出替代策略。如果具体为零长度整数,则您需要 is.integer0 <- function(x) { is.integer(x) && length(x) == 0L } 您也可以

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

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

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

R> length(a)
[1] 0

也许有必要重新考虑您用于确定所需元素的策略,但如果没有进一步的具体细节,则很难提出替代策略。

如果具体为零长度整数,则您需要

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

您也可以使用
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'.
库(断言)

x可能是离题了,但R具有两个漂亮、快速且空感知的函数,用于减少逻辑向量--
any
all

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

受Andrie回答的启发,您可以使用
idential
,并通过使用该类对象的空集这一事实来避免任何属性问题,并将其与该类的元素组合:

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

identical(1L, c(a, 1L))
#> [1] TRUE
attr(a,“foo”)[1]正确
或者更一般地说:

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
为.empty[1]TRUE
is.empty(b,“整数”)
#>[1]错误
isEmpty()
包含在S4Vectors基本包中。不需要加载任何其他包

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

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


另一个选项是
rlang::is_empty
(在tidyverse中工作时很有用)

通过
library(tidyverse)
附加tidyverse时,似乎没有附加rlang名称空间-在这种情况下,您使用的是
purrr::is_empty
,它刚从
rlang
包导入

顺便说一下,
rlang::is_empty
使用

rlang::为空(其中(1:3==5))
#>[1]是的

您可以使用
!长度(x)
而不是
长度(x)==0
@James。是的,但我认为这两种方式都不会有太大的性能问题,
length(x)==0L
对我来说读起来更清楚。@richicotton。0L和0的区别是什么?我试过用谷歌搜索,但没有找到任何相关信息。很抱歉进行了巫术。@Ben:将
L
后缀添加到数字后,R会将其存储为整数而不是浮点值。看,例如,谢谢!这节省了我的时间。我不喜欢将其视为错误的想法——事实上,R不折叠某些空对象的策略有助于避免许多错误恢复流,从而导致更干净的代码。不要使用这些代码。您可以使用
any
进行测试。对于
which(1:3==5)
1:3==5
@bondedust,它将返回FALSE。我试图查找
整数(0)
,我使用
which
作为示例生成了该整数。我知道这很旧,但哈德利,请您概述一下为什么不使用
which
?这对我避免错误代码非常有帮助。是的,如果有类似于
is.empty
,那就太好了,因为有些函数返回
integer(0)
,而不是
NA
NULL
。但是现在你的方法是最简单的,并且是矢量的,这比
length(a)
有很大的优势。这不是最简单的答案,但对初学者来说是最简单和最安全的。。S4Vectors是一个额外的包,并且(截至今天)不在Cran上。可能值得向未来的读者指出,
length(NULL)==0
也是
TRUE
。只能测试
整数(0)
if ( length(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
#[1] "nothing returned for 'a'"
 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'") 
a <- which(1:3 == 5)
isEmpty(a)
# [1] TRUE
x = integer(0)
identical(x, integer(0))
[1] TRUE

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

foo(0)
[1] FALSE