【问题标题】:How to combine do.call() plot() and expression()如何结合 do.call() plot() 和 expression()
【发布时间】:2013-08-16 19:41:14
【问题描述】:

当我尝试将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 的参数中明确定义公式。 IE。 do.call(plot,c(formula=y~x,p))。我不明白为什么我会收到错误 - 特别是因为以下内容没有给出错误:

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

(并在 xaxis 中给出所需的 mu 字符)。

【问题讨论】:

标签: r plot expression do.call


【解决方案1】:

您可以使用alist 而不是list

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

【讨论】:

  • (+1) 不错的选择。
【解决方案2】:

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

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

【讨论】:

  • 谢谢!知道do.call(plot,c(0,p))为什么不报错吗?
  • 有趣的发现!看起来我的猜测为什么它不起作用并不完全正确。一种是使用graphics:::plot.default,另一种是使用graphics:::plot.formula。我看到graphics:::plot.formula 正在使用xlab 参数使用enquote 做一些时髦的事情;我必须仔细观察才能理解为什么会导致它失败。
  • 你们都应该停止在 plotmath-paste 中使用 sep 参数。最好的情况是它们被忽略,最坏的情况是它们被放在表达式的末尾,而不是你想要的地方。
  • 不错的 @Dwin,sep 已删除。
  • @dayne 基本上,正如@DWin 指出的那样,当它位于被plotmath 解释的expression 对象内部时,paste 根本不指熟悉的base::paste。如果您与 x[i] 之类的东西进行比较,可能会更容易理解这一点,它在 plotmath 调用内部和外部也有非常不同的含义。
【解决方案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)

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多