2012-04-22 14 views
13

In R, è possibile che il software ignori il fatto che ci sono argomenti non utilizzati definiti quando viene eseguito un modulo?Argomenti non utilizzati in R

Ad esempio, ho un modulo multiply(a,b), che restituisce il prodotto di a e b. Riceverò un errore se io chiamo il modulo in questo modo:

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

Tornando un errore su questo sembra solo un po 'inutile, dal momento che gli input richiesti a e b sono stati specificati. È possibile evitare questo cattivo comportamento?

Una soluzione facile sarebbe solo smettere di specificare c, ma questo non risponde perché R si comporta in questo modo. C'è un altro modo per risolvere questo?

+1

In risposta a "restituire un errore su questo sembra solo un po 'inutile", io non credo che questo non è necessario, come ci si aspetta chiaramente qualcosa per l'assegnazione dell'argomento aggiuntivo che è necessario dire che l'argomento non esiste per prevenire "un comportamento inatteso" della funzione. –

+0

Innanzitutto, è una funzione, non un modulo. Secondo, in che modo la tua funzione sa cosa fare con gli argomenti aggiuntivi? Penso che la risposta sia corretta, ma dovrebbe essere più illustrativo di come si userebbero effettivamente i punti (ovvero "..."). – geneorama

risposta

23

cambiare la definizione di moltiplicare per prendere ulteriori argomenti sconosciuti:

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

Un approccio (che non riesco a immaginare è una buona pratica di programmazione) è di aggiungere la ... che è tradizionalmente utilizzato per passare argomenti specificati in una funzione all'altra.

> 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 

Si può leggere di più su ... è destinato ad essere utilizzato here

+0

Perché pensi che sarebbe una cattiva pratica? (Non sono in disaccordo, solo curioso.) Mi sembra di aver letto molti documenti R in cui l'argomento '... 'è semplicemente ignorato, il che suggerisce che le persone lo facciano di volta in volta. – joran

+0

... è destinato a passare a funzioni secondarie, in particolare metodi, in cui l'elenco di argomenti richiesto (o accettato) non è noto al momento della scrittura della funzione. Se passi il ... verso il basso, otterrai l'errore "argomento inutilizzato" a un livello più profondo. In generale, non sapere se stai o non stai usando un argomento porta a confusione. –

+0

E mi ha appena colpito che lo faccio abbastanza spesso con i metodi virtuali C++. L'elenco degli argomenti è ovviamente risolto, ma alcuni metodi di oggetti non hanno bisogno di tutti gli argomenti. –

5

È possibile utilizzare i punti: ... nella definizione della funzione.

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

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

# 4 7 
0

Ho avuto lo stesso problema di te. Ho avuto una lunga lista di argomenti, la maggior parte dei quali erano irrilevanti. Non volevo loro codice rigido. Questo è ciò che mi si avvicinò 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 
Problemi correlati