Как поймать целое число (0)? - PullRequest
112 голосов
/ 23 июня 2011

Скажем, у нас есть оператор, который выдает integer(0), например:

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

Какой самый безопасный способ это уловить?

Ответы [ 5 ]

139 голосов
/ 23 июня 2011

Это способ R печати вектора нулевой длины (целого числа), поэтому вы можете проверить, что a имеет длину 0:

R> length(a)
[1] 0

Возможно, стоит переосмыслить стратегию, которую вы используете, чтобы определить , какие элементы вам нужны, но без дополнительных конкретных подробностей сложно предложить альтернативную стратегию.

17 голосов
/ 23 июня 2011

Если это конкретно нулевая длина целые числа , то вам нужно что-то вроде

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'.
12 голосов
/ 23 июня 2011

Может быть не по теме, но в R есть две приятные, быстрые и пустые функции для сокращения логических векторов - any и all:

if(any(x=='dolphin')) stop("Told you, no mammals!")
7 голосов
/ 23 июня 2011
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'") 
6 голосов
/ 23 июня 2011

Вдохновленный ответом Андри, вы можете использовать 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
...