如何结合使用do.call()、plot()和expression()函数?

12

当我尝试将 expressiondo.callplot 结合使用时,出现了错误。

 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))

(并在x轴上给出所需的μ字符。)


非常感谢您对do.call(plot,c(0,p))行为的有趣观察。+1 - Josh O'Brien
@Metrics 我在发帖之前确实看过那个问题。 - dayne
3个回答

14
你可以使用 alist 而不是 list
p <- alist(xlab=expression(paste("Concentration (",mu,"M)")))
do.call(plot,c(y~x,p))

12

do.call在运行函数之前会评估参数;尝试用quote将表达式包装起来:

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

1
谢谢!你知道为什么 do.call(plot,c(0,p)) 不会报错吗? - dayne
1
有趣的发现!看起来我的猜测为什么它没起作用并不完全正确。一个是使用graphics:::plot.default,另一个是使用graphics:::plot.formula。我看到graphics:::plot.formula正在使用enquote处理xlab参数,这可能是导致它失败的原因,我需要仔细研究一下才能理解。 - Aaron left Stack Overflow
2
你应该停止在plotmath-paste中使用sep参数。最好的情况是它们被忽略了,最糟糕的情况是它们被放在表达式的末尾而不是你想要的位置。 - IRTFM
什么是“默认空格”?在R表达式中,空格不会被解释为任何东西。 - IRTFM
1
基本上,正如@DWin所指出的那样,当它在由plotmath解释的“表达式”对象内部时,“paste”根本不是指熟悉的“base :: paste”。如果您将其与像x [i]这样的东西进行比较,可能更容易理解,因为它在plotmath调用内部和外部具有非常不同的含义。 - Josh O'Brien
显示剩余3条评论

7

使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接