pone minutos hervir despues cuantos cocina arroz antes agua r error-handling integer try-catch

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''")