为啥在这里使用 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 <- stat_summary(fun.data = "mean_cl_normal", geom = "errorbar", width = width)
。如果您希望提供对所有美学的访问,则必须逐字定义它们(例如alpha
、colour
、width
等,请参阅 ?geom_errorbar)。或使用...
。以上是关于为啥在这里使用 do.call ?的主要内容,如果未能解决你的问题,请参考以下文章
do.call 和 curve 不能在另一个函数环境中绘制函数