- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在以下示例中,为什么我们比f1
更喜欢使用f2
?从某种意义上说它更有效率吗?对于以前以R为基础的用户,使用“替换+评估”选项似乎更为自然。
library(dplyr)
d = data.frame(x = 1:5,
y = rnorm(5))
# using enquo + !!
f1 = function(mydata, myvar) {
m = enquo(myvar)
mydata %>%
mutate(two_y = 2 * !!m)
}
# using substitute + eval
f2 = function(mydata, myvar) {
m = substitute(myvar)
mydata %>%
mutate(two_y = 2 * eval(m))
}
all.equal(d %>% f1(y), d %>% f2(y)) # TRUE
dplyr
NSE函数进行编程的麻烦,例如replace + eval,还是真的需要学习爱上所有这些
rlang
函数,因为它有好处吗(速度,清晰度,组成性...)?
最佳答案
我想给出一个独立于dplyr
的答案,因为与enquo
相比,使用substitute
有一个非常明显的优势。两者都在函数的调用环境中进行查找,以识别提供给该函数的表达式。区别在于substitute()
仅执行一次,而!!enquo()
将正确遍历整个调用堆栈。
考虑一个使用substitute()
的简单函数:
f <- function( myExpr ) {
eval( substitute(myExpr), list(a=2, b=3) )
}
f(a+b) # 5
f(a*b) # 6
g <- function( myExpr ) {
val <- f( substitute(myExpr) )
## Do some stuff
val
}
g(a+b)
# myExpr <-- OOPS
enquo()
重写的相同函数:
library( rlang )
f2 <- function( myExpr ) {
eval_tidy( enquo(myExpr), list(a=2, b=3) )
}
g2 <- function( myExpr ) {
val <- f2( !!enquo(myExpr) )
val
}
g2( a+b ) # 5
g2( b/a ) # 1.5
enquo()
+
!!
优于
substitute()
+
eval()
的原因。
dplyr
只是简单地充分利用此属性来构建一组连贯的NSE函数。
rlang 0.4.0
引入了一个新的运算符
{{
(发音为“curly curl”),实际上是
!!enquo()
的简写形式。这使我们可以将
g2
的定义简化为
g2 <- function( myExpr ) {
val <- f2( {{myExpr}} )
val
}
关于r - 为什么是enquo + !!最好替代+评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49700912/
我只是想了解这里出了什么问题。在第一种情况(有效)中,我将 enquo()-ted 参数分配给一个变量,在第二种情况下,我直接在调用 mutate 时使用引用的参数>. library("dplyr"
问题 我想在将自定义函数的 enquo 参数传递给 dplyr 链之前确保其类型正确。 我尝试过的 我能够将参数组合到一个数据帧中,然后然后测试每个变量的类型。但我想知道是否有一种解决方案可以在将每种
我正在使用 infer 包运行卡方测试,例如, df %>% chisq_test(label ~ feature) 我想把它放到一个函数中,这样我就可以写: my_chisq_function
我正在编写一个使用大量 dplyr 函数的程序包 - 要通过 devtools::check() 中的所有测试,我必须使用 。数据 频繁。一些功能嵌套到其他功能中。在下面的示例中,我需要在 tidys
我有一个创建数据框的函数,但在此过程中更改了名称。我正在尝试使用 dplyr quosures 处理空列名。我的测试套件如下所示: dataframe % pull(!!target) * 3 # h
我对 enquo 和 toString 的使用仍然有点困惑。在下面的示例中,我基本上只是尝试过滤数据框并在最后对行进行求和。我真的不明白为什么 enquo 和 toString 对我想做的第一件事做同
我对 enquo 和 toString 的使用仍然有点困惑。在下面的示例中,我基本上只是尝试过滤数据框并在最后对行进行求和。我真的不明白为什么 enquo 和 toString 对我想做的第一件事做同
我正在编写一个使用 plot_ly 绘制圆饼图的函数。参数 labels = ~ 中的波浪号 (~) 与反引号运算符 !! 冲突。这个问题有解决方案吗? pieplotr <- function (d
我正在创建一个工作流,其中包含重命名、选择依据和使用我在管道之前提供的名称进行变异的相同管道步骤。 我已经成功使用 enquo()和 !! (bang bang) 重命名为我想要的字符串,然后再次选择
对于整洁的评估来说相对较新,虽然我正在使用的函数可以工作,但我想知道为什么使用不同的辅助函数。例如,enquo 和 ensym 之间有什么区别?在我下面创建的用于捕获每日平均值和移动平均值的函数中,它
在 rlang 中有一个非常微妙(并且非常令人困惑)的区别...... quosures 不是 quosure 对象!换句话说: quo()和 enquo()退订 quos()和 enquos()退订
library(dplyr) #Devel version, soon-to-be-released 0.6.0 library(tidyr) library(ggplot2) library(for
我是一名优秀的程序员,十分优秀!