varias superponer style img htmloutput graficos graficas div r

superponer - Argumentos no utilizados en R



tags$style shiny (5)

En R , ¿es posible hacer que el software ignore el hecho de que hay argumentos no utilizados definidos cuando se ejecuta un módulo?

Por ejemplo, tengo un módulo multiply(a,b) , que devuelve el producto de a y b . Recibiré un error si llamo al módulo así:

multiply(a=20,b=30,c=10)

Devolver un error en esto simplemente parece un poco innecesario, ya que las entradas requeridas a y b han sido especificadas. ¿Es posible evitar este mal comportamiento?

Una solución fácil sería simplemente dejar de especificar c , pero eso no responde por qué R comporta de esta manera. ¿Hay otra manera de resolver esto?


Cambia la definición de multiplicar para tomar argumentos desconocidos adicionales:

multiply <- function(a, b, ...) { # Original code }


El paquete R.utils tiene una función llamada doCall que es como do.call, pero no devuelve un error si se pasan los argumentos no utilizados.

multiply <- function(a, b) a * b # these will fail multiply(a = 20, b = 30, c = 10) # Error in multiply(a = 20, b = 30, c = 10) : unused argument (c = 10) do.call(multiply, list(a = 20, b = 30, c = 10)) # Error in (function (a, b) : unused argument (c = 10) # R.utils::doCall will work R.utils::doCall(multiply, args = list(a = 20, b = 30, c = 10)) # [1] 600 # it also does not require the arguments to be passed as a list R.utils::doCall(multiply, a = 20, b = 30, c = 10) # [1] 600


Podrías usar puntos: ... en tu definición de función.

myfun <- function(a, b, ...){ cat(a,b) } myfun(a=4,b=7,hello=3) # 4 7


Un enfoque (que no puedo imaginar es una buena práctica de programación) es agregar el ... que se usa tradicionalmente para pasar los argumentos especificados en una función a otra.

> multiply <- function(a,b) a*b > multiply(a = 2,b = 4,c = 8) Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8) > multiply2 <- function(a,b,...) a*b > multiply2(a = 2,b = 4,c = 8) [1] 8

Puedes leer más sobre ... está destinado a ser utilizado here


Yo tenía el mismo problema que tú. Tenía una larga lista de argumentos, la mayoría de los cuales eran irrelevantes. No quería codificarlos. Esto es lo que se me ocurrió.

library(magrittr) do_func_ignore_things <- function(data, what){ acceptable_args <- data[names(data) %in% (formals(what) %>% names)] do.call(what, acceptable_args %>% as.list) } do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm") # -9.230675 -10.503509 -10.927077