minutos - el arroz se pone antes o despues de hervir el agua
Cómo atrapar entero(0)? (5)
Digamos que tenemos una declaración que produce un integer(0)
, por ejemplo
a <- which(1:3 == 5)
¿Cuál es la forma más segura de atrapar esto?
Esa es la forma en que R escribe un vector de longitud cero (uno entero), por lo que puedes probar a
ser de longitud 0:
R> length(a)
[1] 0
Podría valer la pena reconsiderar la estrategia que está utilizando para identificar qué elementos desea, pero sin más detalles específicos es difícil sugerir una estrategia alternativa.
Inspirado por la respuesta de Andrie, puede usar identical
y evitar cualquier problema de atributos al usar el hecho de que es el conjunto vacío de esa clase de objetos y combinarlo con un elemento de esa clase:
attr(a,"foo")<-"bar"
> identical(1L,c(a,1L))
[1] TRUE
O más en general:
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
Quizás fuera del tema, pero R tiene dos funciones agradables, rápidas y de vacío para reducir vectores lógicos, any
:
if(any(x==''dolphin'')) stop("Told you, no mammals!")
Si es específicamente enteros de longitud cero, entonces quieres algo como
is.integer0 <- function(x)
{
is.integer(x) && length(x) == 0L
}
Compruébalo con:
is.integer0(integer(0)) #TRUE
is.integer0(0L) #FALSE
is.integer0(numeric(0)) #FALSE
También puedes usar assertive
para esto.
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''.
if ( length(a <- which(1:3 == 5) ) ) print(a) else print("nothing returned for ''a''")
#[1] "nothing returned for ''a''"
Pensándolo mejor, creo que cualquiera es más hermoso que la 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''")