如何捕捉整数(0)?


136

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

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

捕获此问题最安全的方法是什么?


我不喜欢将其视为错误的想法-实际上,R的不折叠某些空对象的策略有助于避免许多错误恢复流,从而使代码更简洁。
mbq 2011年

20
不要使用它。
哈德利2011年

1
您可以使用进行测试any。它将为which(1:3==5)或返回FALSE 1:3==5
IRTFM 2014年

@BondedDust我试图找到integer(0),这是我采用生成which,例如,
RomanLuštrik2014年

6
我知道这很旧了,但是哈德利,你能概述一下为什么不使用which吗?这对我避免错误代码非常有帮助。
仙人掌

Answers:


162

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

R> length(a)
[1] 0

这可能是值得重新考虑你正在使用识别策略,其想要的元素,但没有进一步的具体细节,也很难提出一种替代策略。


19

如果它是零长度整数,那么您需要

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'.

3
您可以使用!length(x)而不是length(x)==0
James

3
@詹姆士。没错,但是我认为这两种方式都不length(x) == 0L会对性能产生太大影响,因此对我来说更清晰。
Richie Cotton

@RichieCotton。0L而不是0代表什么?我曾尝试使用Google搜索,但没有找到任何相关内容。对不起,巫术。
eenblam

2
@Ben:向L数字添加后缀使R将其存储为整数而不是浮点值。参见例如cran.r-project.org/doc/manuals/R-lang.html#Constants
Richie Cotton

谢谢!节省了我的时间。
Andrii

12

也许是题外话,但是R具有两个不错的,快速的和空感知功能,用于减少逻辑向量- anyall

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

1
是的,如果有类似的东西,那会很棒is.empty,因为某些函数返回integer(0)而不是NAor NULL。但就目前而言,您的方式是最直接的,并且是矢量方式的,相对于,这是一个很大的优势length(a)
Ufos

7

受安德里(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

这不是最简单的答案,但是对于初学者来说,这是最简单最安全的答案。
JASC

7
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'") 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.