我正在使用dplyr
并尝试整洁的评估。我对如何检查以确保有人放入裸对象而不是 NSE 字符串感到困惑。例如,我想过滤非缺失数据:
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
df = data_frame(
myvar = c(rep("yes", 2), NA)
)
myfun <- function(x){
x = enquo(x)
num = df %>%
filter(!is.na( !! x))
return(num)
}
myfun(myvar)
#> # A tibble: 2 x 1
#> myvar
#> <chr>
#> 1 yes
#> 2 yes
如果可能,我希望字符串等效于失败。这目前给出了“错误”的结果,因为is.na("myvar")
它绝不是 FALSE。
myfun("myvar") # wrong result
#> # A tibble: 3 x 1
#> myvar
#> <chr>
#> 1 yes
#> 2 yes
#> 3 <NA>
在查看了使用 dplyr::filter 的 tidyeval 方式是什么之后?,似乎filter_at
这两种情况都可以正常工作:
myfun <- function(x){
x = enquo(x)
num = df %>%
filter_at(vars( !! x), all_vars(!is.na(.)))
return(num)
}
myfun(myvar)
#> # A tibble: 2 x 1
#> myvar
#> <chr>
#> 1 yes
#> 2 yes
myfun("myvar") # correct result
#> # A tibble: 2 x 1
#> myvar
#> <chr>
#> 1 yes
#> 2 yes
但是有没有myfun("myvar")
失败的方法?我不能使用colnames()
and if 语句作为未引用的表达式,除非使用as.name
.