有人可以帮助我理解当变量引用采用形式时NSE如何与dplyr一起工作".$mpg"
。
在这里阅读之后,我认为使用as.name可以做到这一点,因为我有一个给出变量名的字符串。
例如,这有效:
mtcars %>%
summarise_(interp(~mean(var), var = as.name("mpg")))
这是行不通的:
mtcars %>%
summarise_(interp(~mean(var), var = as.name(".$mpg")))
但这确实是:
mtcars %>%
summarise(mean(.$mpg))
这样:
mtcars %>%
summarise(mean(mpg))
我希望能够以表格的形式指定变量,.$mpg
以便在没有为数据指定点的选项时可以将其与do()结合使用,如以下示例所示:
library(dplyr)
library(broom)
mtcars %>%
tbl_df() %>%
slice(., 1) %>%
do(tidy(prop.test(.$mpg, .$disp, p = .50)))
最终,我想将其转换为如下功能:
library(lazyeval)
library(broom)
library(dplyr)
p_test <- function(x, miles, distance){
x %>%
tbl_df() %>%
slice(., 1) %>%
do_(tidy(prop.test(miles, distance, p = .50)))
}
p_test(mtcars, ".$mpg", ".$disp")
我本来以为我必须做类似的事情:用替换掉interp(~var, var = as.name(miles)
哪里,但是正如我在顶部提到的那样,这似乎行不通。miles
.$mpg
原因是as.name
创建了一个未评估的变量名,但是.$mpg
在代码中使用时,它不是变量名。而是一个复杂的表达式,它等效于:
`$`(., mpg)
也就是说,它是$
带有两个参数的函数调用。使用as.name
导致R随后搜索具有名称的变量,`.$mpg`
而不是调用上述函数。
这就是为什么您的尝试不起作用的解释。这样,解决方案就相对简单了:我们需要创建一个未评估的函数调用表达式,而不是创建一个未评估的变量名。我们可以通过多种方式来完成此操作,在这里我将展示两个。
首先是简单地调用parse
:
p_test = function (data, miles, distance) {
x = parse(text = miles)[[1]]
n = parse(text = distance)[[1]]
data %>%
slice(1) %>%
do_(interp(~tidy(prop.test(x, n, p = 0.5)), x = x, n = n))
}
现在,您可以致电p_test(mtcars, '.$mpg', '.$disp')
并获得所需的结果。
但是,做同样事情的更dplyr -y方法是将未评估的对象传递给p_test
:
p_test(mtcars, mpg, disp)
…并且我们可以通过一个简单的更改轻松地做到这一点:
p_test_ = function (data, var1, var2) {
data %>%
slice(1) %>%
do_(interp(~tidy(prop.test(.$x, .$n, p = 0.5)),
x = as.name(var1), n = as.name(var2)))
}
p_test = function (data, var1, var2) {
p_test_(data, substitute(var1), substitute(var2))
}
现在,以下两段代码都可以正常工作:
p_test(mtcars, mpg, disp)
p_test_(mtcars, 'mpg', 'disp')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句