Как объединить do.call() plot() и выражение()

Я получаю сообщение об ошибке при попытке комбинирования с помощью expression с do.call и plot.

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

Я могу получить график, который я хочу, используя только функцию plot:

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

Однако я хотел бы реализовать свой сюжет, используя do.call. У меня есть очень длинный список параметров, хранящихся в виде списка, p. Однако, когда я пытаюсь передать список в do.call, я получаю следующую ошибку:

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

Я также попытался явно определить формулу в аргументах, переданных в do.call. то есть. do.call(plot,c(formula=y~x,p)). Я не понимаю, почему я получаю ошибку - особенно потому, что следующее сообщение не дает ошибки:

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

(и дает желаемый символ mu в xaxis).

Ответ 1

do.call оценивает параметры перед запуском функции; попробуйте обернуть выражение в quote:

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

Ответ 2

Вы можете использовать alist, а не list

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

Ответ 3

Настройка quote=TRUE также работает. Это фактически предотвращает do.call() от оценки элементов args перед тем, как передать их функции, заданной 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)