我有一个使用dplyr::select()
的包装函数,但是当我尝试使用它来按名称选择列时,它会抛出一个object * not found error
。我知道它与select()
使用准引号的方式有关,但我不知道为什么。
这是我使用as_mapper
的尝试:
fun1 = as_mapper(~select(.x, .y))
fun1(iris, Species)
Error in .f(.x[[i]], ...) : object 'Species' not found
使用基本功能符号:
fun2 = function(dat, x) {select(substitute(dat), substitute(x))}
fun2(iris, Species:Sepal.Length)
Error in UseMethod("select_") :
no applicable method for 'select_' applied to an object of class "name"
如果有人能阐明为什么发生这些错误,我将不胜感激。
答案 0 :(得分:1)
我认为这与R中的非标准评估(NSE)有关。为什么不尝试使用rlang
来处理dplyr
函数,如here所示。
library(magrittr)
fun2 <- function(dat, x) {
x <- rlang::enquo(x)
dplyr::select(dat,!!x)
}
fun2(iris, Species:Sepal.Length) %>% tibble::tibble()
# A tibble: 150 x 1
.$Species $Petal.Width $Petal.Length $Sepal.Width $Sepal.Length
<fct> <dbl> <dbl> <dbl> <dbl>
1 setosa 0.2 1.4 3.5 5.1
2 setosa 0.2 1.4 3 4.9
3 setosa 0.2 1.3 3.2 4.7
4 setosa 0.2 1.5 3.1 4.6
5 setosa 0.2 1.4 3.6 5
6 setosa 0.4 1.7 3.9 5.4
7 setosa 0.3 1.4 3.4 4.6
8 setosa 0.2 1.5 3.4 5
9 setosa 0.2 1.4 2.9 4.4
10 setosa 0.1 1.5 3.1 4.9
# ... with 140 more rows
我还要指出,@ MrFlick也是正确的,并且通过curl-curly运算符使用new interpolation method是一个不错的快捷方式