Argumento predeterminado dependiendo de la función coincidente en R.
Actualmente tengo dos envolturas muy similares alrededor de table
y xtabs
:
mytable <- function(..., useNA = "ifany") {
tab <- table(..., useNA = useNA)
# manipulaciones adicionales
tab
}
mytable(warpbreaks[-1])
myxtabs <- function(..., na.action = NULL, addNA = TRUE) {
tab <- xtabs(..., na.action = na.action, addNA = addNA)
# mismas manipulaciones que en mytable
tab
}
myxtabs(breaks ~ ., warpbreaks)
Como gran parte del código se repite, deseo combinar ambas envolturas en una sola. Una solución simple es:
newfun <- function(..., fun) {
fun <- match.fun(fun)
tab <- fun(...)
# mismas manipulaciones que en mytable
tab
}
newfun(warpbreaks[-1], fun = table)
newfun(breaks ~ ., warpbreaks, fun = xtabs)
Sin embargo, ¿puedo especificar argumentos predeterminados dependiendo de la función que se empareja? es decir:
- si
fun = table
, estableceruseNA = "ifany"
; - o si
fun = xtabs
, establecerna.action = NULL
yaddNA = TRUE
.
Además, ¿cuál es la forma “recomendada” de restringir fun
solo a table
y xtabs
? Supongo que hay muchas maneras de lograr esto (stopifnot
, if
/else
, switch
, match.arg
), pero estoy buscando una buena práctica aquí.
davy.ai
Para especificar argumentos predeterminados dependiendo de qué función se llame, puedes utilizar la función
ifelse
dentro del envoltorionewfun
. Aquí hay una versión actualizada del código con esta modificación:Para restringir el argumento
fun
solo atable
yxtabs
, puedes utilizar la funciónmatch.arg
con el argumentochoices
especificado como un vector de caracteres de nombres de funciones permitidas. Aquí hay una versión actualizada del envoltorionewfun
con esta modificación:Este enfoque asegura que
fun
se restringa solo a los nombres de función permitidos y también te permite especificar un valor predeterminado parafun
.