programacion numero funciones ejercicios ejemplos r function arguments exists

numero - Cómo verificar la existencia de un argumento de entrada para las funciones R



funciones r en r ejemplos (4)

@Sacha Epskamp tiene una solución bastante buena, pero no siempre funciona. El caso donde falla es si el argumento "z" se pasa como NULL ...

# Sacha''s solution myFun <- function(x, y, ...) { args <- list(...) exist <- !is.null(args[[''z'']]) return(exist) } myFun(x=3, z=NULL) # FALSE, but should be TRUE! # My variant myFun2 <- function(x, y, ...) { args <- list(...) exist <- "z" %in% names(args) exist } myFun2(x=3, z=NULL) # TRUE

Tengo una función definida como

myFun <- function(x, y, ...) { # using exists if (exists("z")) { print("exists z!") } # using missing try(if (!missing("z")) { print("z is not missing!") }, silent = TRUE) # using get try(if (get("z")) { print("get z!") }, silent = TRUE) # anotherFun(...) }

En esta función, quiero verificar si el usuario ingresó "z" en la lista de argumentos. ¿Cómo puedo hacer eso? Intenté exists("z") , missing("z") y get("z") y ninguno de ellos funciona.


Creo que simplemente estás buscando hasArg

myFun <- function(x, y, ...) { hasArg(z) } > myFun(x=3, z=NULL) [1] TRUE

Desde ?hasArg :

La expresión hasArg (x), por ejemplo, es similar a! Missing (x), con dos excepciones. Primero, hasArg buscará un argumento llamado x en la llamada si x no es un argumento formal para la función de llamada, pero ... es. Segundo, hasArg nunca genera un error si se le da un nombre como argumento, mientras que missing (x) genera un error si x no es un argumento formal.


Esta es una forma en que a menudo lo hago. Primero convierte ... a una lista, luego verifica si los elementos no son NULL :

myFun <- function(x, y, ...) { args <- list(...) exist <- !is.null(args[[''z'']]) return(exist) }

Algunos resultados:

> myFun() [1] FALSE > myFun(z=1) [1] TRUE


Puede haber casos en los que no quiera llamar a la list(...) , ya que esto evaluará todas las expresiones en los puntos. Por ejemplo,

myFun <- function(x, y, ...){ myArgs <- list(...) zInArgs <- ("z" %in% names(myArgs)) return(zInArgs) } myFun(x = 2, y = "Happy", z = list(rep(rnorm(2e6), 100)))

Esto llevará un largo tiempo. En su lugar, use match.call() :

myFun <- function(x, y, ...){ myArgs <- match.call() zInArgs <- ("z" %in% names(myArgs)) return(zInArgs) } myFun(x = 2, y = "Happy", z = list(rep(rnorm(2e6), 100)))

El primer ejemplo todavía se está resquebrajando en mi máquina, mientras que el segundo ejemplo no debería tomar prácticamente ningún tiempo.

EDITAR:

Para responder el comentario de @CarlWitthoft:

R> system.time( + (myAns <- myFun(x = 2, y = "Happy", z = list(rep(rnorm(2e6), 100)))) + ) user system elapsed 0 0 0 R> myAns [1] TRUE