2012-04-22 16 views
13

En R, ¿es posible hacer que un 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. Voy a recibir un error si llamo el módulo de esta manera:Argumentos no utilizados en R

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

Volviendo un error en esto sólo parece un poco innecesario, ya que se han especificado las entradas requeridas y ab. ¿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 se comporta así. ¿Hay alguna otra forma de resolver esto?

+1

En respuesta a "Devolver un error sobre esto simplemente parece un poco innecesario", no creo que esto sea innecesario, ya que claramente está esperando algo para asignar el argumento adicional, necesita que le digan que el argumento no existe para evitar el "comportamiento inesperado" de la función. –

+0

Primero, es una función, no un módulo. Segundo, ¿cómo sabe tu función qué hacer con los argumentos adicionales? Creo que la respuesta es correcta, pero debería ser más ilustrativa de cómo uno realmente usaría los puntos (también conocido como "..."). – geneorama

Respuesta

23

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

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

Un enfoque (que no puedo imaginar una buena práctica de programación) para añadir el ... que se utiliza tradicionalmente para pasar 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 

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

+0

¿Por qué crees que esto sería una mala práctica? (No estoy en desacuerdo, solo tengo curiosidad). Siento que he leído mucha documentación de R donde el argumento '...' simplemente se ignora, lo que sugiere que la gente hace esto de vez en cuando. – joran

+0

... está destinado a pasar a subfunciones, particularmente a métodos, donde la lista de argumentos requerida (o aceptada) no se conoce en el momento en que se escribe la función. Si pasa el ... hacia abajo, obtendrá el error de "argumento no utilizado" en un nivel más profundo. En general, no saber si estás o no usando un argumento conduce a la confusión. –

+0

Y me acaba de ocurrir que hago esto con la frecuencia suficiente con los métodos virtuales de C++. La lista de argumentos es, por supuesto, fija, pero algunos métodos de objetos no necesitan todos los argumentos. –

5

Usted podría utilizar puntos: ... en su definición de la función.

myfun <- function(a, b, ...){ 
    cat(a,b) 
} 

myfun(a=4,b=7,hello=3) 

# 4 7 
0

Tuve 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 surgió con

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 
Cuestiones relacionadas