2013-07-15 14 views
10

A volte, chiamando una funzione con determinati argomenti si ottiene il messaggio di errore formal argument "foo" matched by multiple actual arguments. È possibile stampare la lista degli argomenti reali ambigui?"Argomento formale" pippo "abbinato a più argomenti" - come affrontare questo in R?

Il motivo che sto chiedendo questo è attualmente un problema con la funzione plot per gli oggetti della classe mixEM (generato dal normalmixEM dal pacchetto mixtools). Non accetta l'argomento ylim che produce l'errore sopra, ma quando provo a usare ylim2 (il modo in cui funziona per xlab2, main2, col2 ecc.), Dice "ylim2" is not a graphical parameter. Quindi mi chiedo quali sono gli argomenti reali che corrispondono a ylim?

Uso formals(plot.mixEM) non aiuta perché non contiene nulla che iniziano ylim, ma poi alla fine si riferisce ... quali sono i parametri grafici passati plot. Tuttavia, per la funzione plot, ylim non è ambigua. Ottenere una descrizione più esatta dell'errore da R con un elenco degli argomenti in conflitto sarebbe utile.

UPD: MWE:

library(mixtools) 
wait = faithful$waiting 
mixmdl = normalmixEM(wait) 
plot(mixmdl, which = 2, xlim = c(25, 110), nclass=20) 
lines(density(wait), lty = 2, lwd = 2) 

Questo produce un errore:

plot(mixmdl, which = 2, xlim = c(25, 110), ylim = c(0, .5), nclass=20) 

# Error in hist.default(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, : 
# formal argument "ylim" matched by multiple actual arguments` 

Questo semplicemente non funziona:

plot(mixmdl, which = 2, xlim = c(25, 110), ylim2 = c(0, .5), nclass=20) 

# Warning messages: 
# 1: In title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) : 
# "ylim2" is not a graphical parameter 
# 2: In axis(1, ...) : "ylim2" is not a graphical parameter 
# 3: In axis(2, ...) : "ylim2" is not a graphical parameter 
+2

È più facile aggiungere il codice che producono l'errore rispetto al modo narrativo ... – agstudy

+1

@agstudy Ho aggiunto un MWE. Tuttavia, apprezzerei anche un consiglio generale su come affrontare questo tipo di errori, perché questa non è la prima e probabilmente non l'ultima volta che incontro questo tipo di problemi. – AnjaM

+0

FYI - questo errore può verificarsi anche se si aggiunge accidentalmente un argomento a una chiamata di funzione due volte. –

risposta

7

Il tuo problema è essenzialmente di tipo:

plot(1:10, rnorm(10), ylim=c(0,1), ylim=c(-1,100)) 
Error in plot.default(1:10, rnorm(10), ylim = c(0, 1), ylim = c(-1, 100)) : 
    formal argument "ylim" matched by multiple actual arguments 

perché il vostro ylim -definizione viene passato a una funzione trama con il "..." - argomento, nella seguente riga di trama. mixEM:

hist(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, maxy), ...) 

mentre ylim è stata definita dal seguente limite superiore:

maxy <- max(max(a$density), 0.3989 * mix.object$lambda/mix.object$sigma) 

Si noti che si sta chiamando la funzione di stampa per un oggetto di tipo mixEM. Guardando il codice della funzione di stampa predefinita plot.default ti lascerà perplesso, in quanto è in realtà plot.mixEM che stai chiamando. Se si digita la trama .mixEM nel terminale vedrai il suo codice e ? plot.mixEM ti aiuterà. Questo è un approccio tipico in R, dove la funzione predefinita functionname.default viene sostituita da una funzione specifica della classe fornita dal pacchetto nel formato nomefile.classname.

You got opzioni paio:

  1. Scrivi la tua plot.mixEM sostituendo la parte hard-coded nella funzione originaria , avete solo bisogno di cambiare le linee di coppia.
  2. Plot finestra prima plot.mixEM e aggiungere il "add = TRUE" parametro, il che significa che noi non creare una nuova finestra tramando, ma invece aggiungere a quello esistente.

Questo è il modo in opzione 2 opere:

library(mixtools) 
wait = faithful$waiting 
mixmdl = normalmixEM(wait) 
plot.new() 
plot.window(xlim=c(25,110), ylim=c(0,0.5)) 
plot(mixmdl, which = 2, nclass=20, add = TRUE) 
lines(density(wait), lty = 2, lwd = 2) 
box(); axis(1); axis(2); title(xlab="Data", ylab="Density") 

Example plot

+0

Grazie mille, entrambe le opzioni funzionano! – AnjaM

2
library(mixtools) 
wait = faithful$waiting 
mixmdl = normalmixEM(wait) 

plot(mixmdl, which = 2, xlim = c(25, 110), ylim = c(0, .5), nclass=20) 
#Error in hist.default(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, : 
# formal argument "ylim" matched by multiple actual arguments 

Il messaggio di errore è abbastanza informativo . Ti dice quale funzione ottiene il parametro due volte. Per maggiori informazioni:

traceback() 

# 4: hist.default(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, 
#                  maxy), ...) 
# 3: hist(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, 
#                maxy), ...) 
# 2: plot.mixEM(mixmdl, which = 2, xlim = c(25, 110), ylim = c(0, 
#                0.5), nclass = 20) 
# 1: plot(mixmdl, which = 2, xlim = c(25, 110), ylim = c(0, 0.5), 
#   nclass = 20) 

Quindi, c'è una chiamata a hist in plot.mixEM che imposta già ylim = c(0,maxy). Il tuo ylim = c(0,0.5) viene passato tramite i puntini di sospensione (...), in modo che hist.default venga passato due volte ylim. Quindi, l'errore.

+0

Ok, grazie. Ma perché il 'ylim' nella mia chiamata non sovrascrive i valori di default impostati da' plot.mixEM'? E come posso cambiarlo? – AnjaM

+0

A causa delle ellissi. Definisci la tua funzione di tracciamento (copia il codice da 'plot.mixEM' e rimuovi' ylim = c (0, maxy) 'dalla chiamata all'origine di' hist'). – Roland

+0

Grazie, penso di aver capito! – AnjaM

Problemi correlati