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