2013-08-16 11 views
12

Ricevo un errore quando provo a combinare utilizzando expression con do.call e plot.Come combinare do.call() plot() ed expression()

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

posso ottenere la trama che voglio utilizzando solo la funzione plot:

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

Tuttavia, vorrei realizzare il mio grafico usando do.call. Ho una lunga lista di parametri memorizzati come lista, p. Tuttavia, quando provo e passo l'elenco per do.call ricevo il seguente errore:

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 

Ho provato anche la definizione della formula esplicitamente nei args passati alla do.call. vale a dire. do.call(plot,c(formula=y~x,p)). Non capisco perché sto ottenendo l'errore - soprattutto perché il seguente non dà un errore:

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

(e dà il carattere mu desiderato nella Xaxis).

+0

+1 per la tua interessante osservazione sul comportamento di 'do.call (trama, c (0, p))'. –

+0

possibile duplicato di [plot() e do.call(): come passare le espressioni per tracciare il titolo quando '...' è usato in altro modo?] (Http://stackoverflow.com/questions/13982856/plot-and- do-call-how-to-pass-expression-to-plot-title-when-is-used-o) – Metrics

+0

@Metrics Ho letto quella domanda prima di postare. – dayne

risposta

12

do.call valuta i parametri prima di eseguire la funzione; provare avvolgendo l'espressione in quote:

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

Grazie! Sai perché 'do.call (plot, c (0, p))' non dà un errore? – dayne

+1

Scoperta interessante! Sembra che la mia ipotesi sul perché non ha funzionato non era del tutto corretta. Uno sta usando 'graphics ::: plot.default' e l'altro sta usando' graphics ::: plot.formula'. Vedo che 'graphics ::: plot.formula' sta facendo cose strane con il parametro' xlab' usando 'enquote'; Dovrei guardare più da vicino per capire perché questo fa fallire. – Aaron

+2

Dovresti smettere di usare gli argomenti 'sep' in plotmath-'paste'. Nella migliore delle ipotesi vengono ignorati, e nella peggiore delle ipotesi vengono messi alla fine dell'espressione e non dove li volevi. –

13

È possibile utilizzare alist piuttosto che list

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

(+1) Bella alternativa. – dayne

7

Impostazione quote=TRUE funziona anche. In effetti impedisce a do.call() di valutare gli elementi di args prima di passarli alla funzione data da 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)