为啥在这里使用 do.call ?

Posted

技术标签:

【中文标题】为啥在这里使用 do.call ?【英文标题】:Why use do.call here?为什么在这里使用 do.call ? 【发布时间】:2018-12-10 11:06:04 【问题描述】:

这是 ggplot2 数据分析优雅图形的示例

geom_mean <- function(..., bar.params = list(), errorbar.params = list()) 
  params <- list(...)
  bar.params <- modifyList(params, bar.params)
  errorbar.params <- modifyList(params, errorbar.params)

  bar <- do.call("stat_summary", modifyList(
    list(fun.y = "mean", geom = "bar", fill = "grey70"),
    bar.params)
  )
  errorbar <- do.call("stat_summary", modifyList(
    list(fun.data = "mean_cl_normal", geom = "errorbar", width = 0.4),
    errorbar.params)
  )

  list(bar, errorbar)

显示

在这段代码中,do.call()roll 是什么?

我不知道为什么这段代码需要do.call()

替换do.call()的另一个函数是什么?

【问题讨论】:

【参考方案1】:

do.call 使用作为列表提供的参数调用函数。 例如,

 do.call("plot", list(x = 1:10, y = 1:10))

将导致

plot(x = 1:10, y = 1:10)

这种方法允许使用任意参数编号,它们是 被

抓住了
params <- list(...)

然后您可以先根据需要修改其中一些,然后使用此修改后的列表调用函数stat_summary

do.call("stat_summary", params)

原因是stat_summary 本身接受任意数量的参数(参见... 在其文档中)。 如果您要描述所有可能的参数名称, 哪个用户可能提供,这会导致很多不灵活的代码 (想象一下,stat_summary 将在下一个版本中获得更多选项,并且 必须始终相应地更新您的代码)。

【讨论】:

总结你的解释,因为geom_mean()...stat_summary()可以取...,所以我们必须使用do.call()。所以功能变得更加灵活。对吗? 正确。如果您想拥有 ... ,这是相关的。但是如果你将它定义为geom_mean(width = 0.4),那么你可以简单地写成errorbar &lt;- stat_summary(fun.data = "mean_cl_normal", geom = "errorbar", width = width)。如果您希望提供对所有美学的访问,则必须逐字定义它们(例如alphacolourwidth 等,请参阅 ?geom_errorbar)。或使用...

以上是关于为啥在这里使用 do.call ?的主要内容,如果未能解决你的问题,请参考以下文章

lapply和do.call有什么区别?

do.call(rbind, list) 用于奇数列

R语言do.call函数和call函数实战

do.call 和 curve 不能在另一个函数环境中绘制函数

为啥 summary(object) 有效但 plot(object) 无效?

R do.call函数中的错误[关闭]