2013-07-15 10 views
10

Czasami wywołanie funkcji z określonymi argumentami powoduje wyświetlenie komunikatu o błędzie formal argument "foo" matched by multiple actual arguments. Czy jest możliwe wydrukowanie listy niejednoznacznych faktycznych argumentów?"Formalna argumentacja" foo "dopasowana przez wiele argumentów" - jak sobie z tym poradzić w R?

Powód pytam jest to obecnie problem z funkcją plot dla obiektów klasy mixEM (generowanego przez normalmixEM z pakietu mixtools). Nie akceptuje argumentu, który podał powyższy błąd, ale gdy próbuję użyć ylim2 (tak jak działa dla xlab2, main2, col2 itp.), Jest to "ylim2" is not a graphical parameter. Więc zastanawiam się, jakie są rzeczywiste argumenty, które są dopasowane przez ylim?

Stosując formals(plot.mixEM) nie pomaga, ponieważ nie zawiera żadnych zaczynając ylim, a następnie na koniec dotyczy on ... które są graficznymi parametry przekazywane do plot. Jednak dla funkcji plot, byłoby jednoznaczne. Pomocne byłoby uzyskanie dokładniejszego opisu błędu z R z listą argumentów powodujących konflikt.

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) 

To daje błąd:

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` 

to po prostu nie działa:

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

Łatwiej jest dodać kod, który produkują błąd niż sposób narracji ... – agstudy

+1

@agstudy Dodałem MWE. Byłbym jednak wdzięczny za ogólną radę, jak radzić sobie z tego rodzaju błędami, ponieważ nie jest to pierwszy i prawdopodobnie nie ostatni raz, kiedy napotykam na tego typu problemy. – AnjaM

+0

FYI - ten błąd może również wystąpić, jeśli przypadkowo dodasz argument do wywołania funkcji dwa razy. –

Odpowiedz

7

Twój problem jest zasadniczo typu:

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 

ponieważ ylim -definition zostanie przekazana do funkcji plot z "..." - argument w następnym wierszu działki. Mixem:

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

podczas ylim został zdefiniowany za pomocą następującego górna granica:

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

Zauważ, że wywołujesz funkcję drukowania dla obiektu typu mixEM. Patrząc na kod domyślnej funkcji drukowania plot.default, pozostaniesz zaintrygowany, ponieważ tak naprawdę jest to plot.mixEM, do którego dzwonisz. Jeśli wpiszesz wykres .mixEM w terminalu zobaczysz jego kod, a ? plot.mixEM również ci pomoże. Jest to typowe podejście w R, gdzie domyślna funkcja functionname.default została zastąpiona przez specyficzną dla klasy funkcję zapewnianą przez pakiet w formacie functionname.classname.

Masz kilka opcji:

  1. wyraź swoją plot.mixEM zastępując zakodowane udział w pierwotnej funkcji , trzeba tylko zmienić kilka wierszy.
  2. Działka okno przed plot.mixEM i dodać „add = true” parametr, co oznacza, że ​​nie będziemy tworzyć nowe okno kreślenia ale zamiast dodać do istniejącego.

To jest jak opcja 2 utwory:

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

Wielkie dzięki, obie opcje działają! – 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 

Komunikat o błędzie jest dość dobrze poinformowany . Informuje, która funkcja dwukrotnie przekazuje parametr. Aby uzyskać więcej informacji:

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) 

Tak więc, nie jest wezwaniem do hist w plot.mixEM że już ustawia ylim = c(0,maxy). Twój ylim = c(0,0.5) zostanie przekazany za pośrednictwem wielokropka (...), aby hist.default został dwukrotnie przekazany ylim. Stąd błąd.

+0

Ok, dzięki. Ale dlaczego 'ylim' w moim wywołaniu nie zastąpi domyślnych wartości ustawionych przez' plot.mixEM'? I jak mogę to zmienić? – AnjaM

+0

Z powodu elips. Zdefiniuj własną funkcję kreślenia (skopiuj kod z 'plot.mixEM' i usuń' ylim = c (0, maxy) 'z błędnego wywołania' hist'). – Roland

+0

Dzięki, myślę, że mam! – AnjaM