mi código R termina contiene gran cantidad de declaraciones de la forma:

if (!is.null(aVariable)) { 
     do whatever 
}

Pero este tipo de instrucción es difícil de leer, ya que contiene dos negaciones. Yo preferiría algo como:

 if (is.defined(aVariable)) { 
      do whatever 
 }

Hace un is.defined tipo de función que hace lo contrario de !es.null existe norma en R?

saludos,
yannick

  • ¿De dónde aVariable vienen? es un elemento en un vector, un mundial o no-vector argumento a una función? Puedo tener más sugerencias.
  • tal vez ‘existe’ está cerca de lo que usted está buscando
  • ver Harlan comentario a continuación sobre ‘existe’…
InformationsquelleAutor Yannick Wurm | 2010-02-01

6 Comentarios

  1. 33

    Que puede ser mejor trabajo qué tipo de valor de su función o código acepta, y pidiendo que:

    if (is.integer(aVariable))
    {
      do whatever
    }

    Esto puede ser una mejora con respecto a isnull, porque proporciona el tipo de comprobación. Por otro lado, se puede reducir la genericity de su código.

    Alternativamente, acaba de hacer la función que desea:

    is.defined = function(x)!is.null(x)
    • El nombre is.defined no está muy bien ya que se puede declarar una variable con el valor NULL. Intente, por ejemplo,x <- NULL; x. isnt.null sería un nombre más apropiado para la función.
    • en perl, por lo menos, una variable que se considera no se define si se tiene el valor de la undef, que es igual a null.
  2. 16

    Si es sólo una cuestión de fácil lectura, siempre se puede definir su propia función :

    is.not.null <- function(x) !is.null(x)

    Así que usted puede utilizar a lo largo de todo el programa.

    is.not.null(3)
    is.not.null(NULL)
  3. 8

    Ian poner esto en el comentario, pero creo que es una buena respuesta:

    if (exists("aVariable"))
    {
      do whatever
    }

    tenga en cuenta que el nombre de la variable es citado.

    • Yo no creo que este sea el mismo. exists se comprueba si la variable es dependiente. is.null asume que la variable está obligado, y las pruebas de si es o no de su contenido es el objeto NULO. No son intercambiables.
  4. 2

    La shiny paquete proporciona las funciones convenientes validate() y need() para comprobar que las variables están disponibles y válido. need() evalúa una expresión. Si la expresión no es válida, aparecerá un mensaje de error. Si la expresión es válida, NULL se devuelve. Uno puede utilizar esto para comprobar si una variable es válida. Ver ?need para obtener más información.

    Sugiero definir una función como esta:

    is.valid <- function(x) {
      require(shiny)
      is.null(need(x, message = FALSE))  
    }

    Esta función is.valid() volverá FALSE si x es FALSE, NULL, NA, NaN, una cadena vacía "", un vacío atómico vector un vector que contiene sólo valores perdidos, una lógica vector que contiene sólo FALSE, o un objeto de la clase try-error. En todos los demás casos, se devuelve TRUE.

    Que significa, need() (y is.valid()) cubre un amplio rango de error de los casos. En lugar de escribir:

    if (!is.null(x) && !is.na(x) && !is.nan(x)) {
      ...
    }

    uno puede escribir simplemente:

    if (is.valid(x)) {
      ...
    }

    Con el cheque para la clase try-error, incluso puede ser utilizado en conjunción con un try() bloque silenciosamente a la captura de los errores: (ver https://csgillespie.github.io/efficientR/programming.html#communicating-with-the-user)

    bad = try(1 + "1", silent = TRUE)
    if (is.valid(bad)) {
      ...
    }
  5. 2

    También he visto:

    if(length(obj)) {
      # do this if object has length
      # NULL has no length
    }

    Yo no creo que sea grande, aunque. Debido a que algunos vectores pueden ser de longitud 0. character(0), logical(0), integer(0) y que puede ser tratada como un valor NULL en lugar de un error.

  6. 0

    Para manejar variables no definidas, así como los nulos, puede utilizar substitute con deparse:

    nullSafe <- function(x) {
      if (!exists(deparse(substitute(x))) || is.null(x)) {
        return(NA)
      } else {
        return(x)
      }
    }
    
    nullSafe(my.nonexistent.var)

Dejar respuesta

Please enter your comment!
Please enter your name here