Скажем, мы имеем инструкцию, которая производит integer(0)
, например.
a <- which(1:3 == 5)
Какой самый безопасный способ поймать это?
Скажем, мы имеем инструкцию, которая производит integer(0)
, например.
a <- which(1:3 == 5)
Какой самый безопасный способ поймать это?
Это 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
Возможно, вне темы, но R имеет две хорошие, быстрые и пустые функции для сокращения логических векторов - any
и all
:
if(any(x=='dolphin')) stop("Told you, no mammals!")
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'")
Вдохновленный Андри, вы можете использовать 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