我很难理解这一点。
下面让我以“整洁”的方式过滤我的 data.frame,并使用plotly 绘制一个图。在本例中,我使用plotly基于公式的API来说明要使用数据框的哪些列:
library(plotly)
tidy_filter = function(data, x) {
x = enquo(x)
filter(data, !!x > 5)
}
mtcars %>%
tidy_filter(wt) %>%
plot_ly(x = ~wt, y = ~wt)
Run Code Online (Sandbox Code Playgroud)
我可以将其包装在一个函数中以获得相同的结果:
tidy_ply = function(data, x) {
x = enquo(x)
data = filter(data, !!x > 5)
plot_ly(data, x = x, y = x)
}
tidy_ply(mtcars, wt)
Run Code Online (Sandbox Code Playgroud)
现在:
我认为enquo(x)在这种情况下至少部分相当于~wt因为这就是它的工作原理。但它们是两个不同的东西(定量VS公式)。它们之间是什么关系,为什么上面的方法有效?
plotly 的公式 API 的优点是,如果我想操纵输入值,我可以做类似~wt/2. 但在上面的操作中,plot_ly(data, x = x, y = x/2)会产生错误。有办法让这项工作发挥作用吗?
我想普遍的问题是如何最好地将整洁的评估方法与情节的公式方法结合起来?
来自@alistaire 的回答:
R
plotly包是在不久之前创建的rlang,并且有自己的非标准评估(NSE)系统,据我所知,该系统大部分仅记录在示例中。当 NSE 系统出现问题时,让它发挥作用的最快方法是动态重写所有代码,然后对其进行评估。在这里,在您喜欢的任何地方用替换包装整个
plotly管道,然后调用它将其折叠为单个表达式(而不是嵌套的定额),然后调用整个管道来实际运行它。quo!!quo_squasheval_tidy在 中
plotly,~用于引用要可视化的数据集中的列 (@cpsievert)。
在您的示例中,x是一个定语,因此您必须在应用任何基运算符之前首先取消引用它。这就是错误消息告诉您的内容:
Error: Base operators are not defined for quosures.
Do you need to unquote the quosure?
# Bad:
myquosure / rhs
# Good:
!!myquosure / rhs
Run Code Online (Sandbox Code Playgroud)
这是一个可行的解决方案:
Error: Base operators are not defined for quosures.
Do you need to unquote the quosure?
# Bad:
myquosure / rhs
# Good:
!!myquosure / rhs
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2019-04-03 创建(v0.2.1.9000)