2013-08-16 15 views
12

Otrzymuję błąd, gdy próbuję połączyć z użyciem expression z do.call i plot.Jak połączyć do.call() plot() i expression()

x <- 1:10 
y <- x^1.5 

mogę dostać działkę chcę używając tylko funkcję plot:

plot(y~x,xlab=expression(paste("Concentration (",mu,"M)"))) 

Jednak chciałbym wdrożyć moją działkę przy użyciu do.call. Mam naprawdę długą listę parametrów przechowywanych jako lista, p. Jednak, gdy próbuję i przekazać listę do.call pojawia się następujący błąd:

p <- list(xlab=expression(paste("Concentration (",mu,"M)"))) 
do.call(plot,c(y~x,p)) 
Error in paste("Concentration (", mu, "M)") : 
    object 'mu' not found 

Próbowałem też definiowania formuły wyraźnie w args przekazywanych do.call. to znaczy. do.call(plot,c(formula=y~x,p)). Nie rozumiem, dlaczego ja dostaję błąd - szczególnie dlatego, że nie daje następujący błąd:

do.call(plot,c(0,p)) 

(i daje żądany znak il w Xaxis).

+0

+1 za twoją ciekawą obserwację na temat zachowania 'do.call (wykres, c (0, p))'. –

+0

możliwy duplikat [plot() i do.call(): Jak przekazywać wyrażenia do tytułu fabuły, gdy "..." jest używane inaczej?] (Http://stackoverflow.com/questions/13982856/plot-and- do-call-how-to-pass-expressions-to-plot-title-when-is-used-o) – Metrics

+0

@Metrics Zrobiłem to pytanie przed opublikowaniem. – dayne

Odpowiedz

12

do.call ocenia parametry przed uruchomieniem funkcji; spróbować owijania wyraz w quote:

p <- list(xlab=quote(expression(paste("Concentration (",mu,"M)")))) 
do.call("plot", c(y~x, p)) 
+1

Dzięki! Czy wiesz, dlaczego 'do.call (działka, c (0, p))' nie daje błąd? – dayne

+1

Interesujące znalezisko! Wygląda na to, że moje przypuszczenie, dlaczego to nie zadziałało, nie było całkiem poprawne. Jeden używa 'graphics ::: plot.default', a drugi używa' graphics ::: plot.formula'. Widzę, że 'graphics ::: plot.formula' robi jakieś fajne rzeczy za pomocą parametru' xlab' używając 'enquote'; Muszę przyjrzeć się bliżej, aby zrozumieć, dlaczego powoduje to niepowodzenie. – Aaron

+2

Powinieneś przestać używać argumentów 'sep' w plotmath -'paste'. W najlepszym wypadku są one ignorowane, aw najgorszym przypadku są umieszczane pod koniec wyrażenia, a nie w miejscu, w którym ma się je znaleźć. –

13

Można użyć alist a następnie list

p <- alist(xlab=expression(paste("Concentration (",mu,"M)"))) 
do.call(plot,c(y~x,p)) 
+1

(+1) Dobra alternatywa. – dayne

7

Ustawianie quote=TRUE również działa. W efekcie uniemożliwia to oszacowanie elementów do.call() przed przekazaniem ich do funkcji podanej przez what.

x <- 1:10 
y <- x^1.5 
p <- list(xlab=expression(paste("Concentration (",mu,"M)",sep=""))) 

do.call(what = "plot", args = c(y ~ x, p), quote = TRUE)