rlang::ensym()
几乎为此目的而存在,除了它的输出是名称而不是字符串,因此您需要对其进行转换。
test_fun <- function(by) {
as.character(rlang::ensym(by))
}
test_fun(varname)
#> [1] "varname"
test_fun("varname")
#> [1] "varname"
由reprex 包(v0.2.1)于 2019 年 8 月 8 日创建
我认为这样做不一定是坏事,foo <- "bar"
并且"foo" <- "bar"
是等价的,"head"(iris)
并且head(iris)
是等价的,这使得拥有类似和等价ensym()
的东西变得容易。它对于交互使用很方便,如果您希望您的功能与, 甚至等一致,那么不支持此功能确实会更令人惊讶。select(iris, "Species")
select(iris, Species)
dplyr::select()
base::library()
只要确保它在您的用例中有意义,否则它确实可能会令人困惑。
如果您想要弃用警告,您可以使用:
test_fun <- function(by) {
if(is.character(rlang::enexpr(by)))
warning("literal string input is deprecated, please use raw variable names")
as.character(rlang::ensym(by))
}
test_fun(varname)
#> [1] "varname"
test_fun("varname")
#> Warning in test_fun("varname"): literal string input is deprecated, please use raw
#> variable names
#> [1] "varname"
由reprex 包(v0.2.1)于 2019 年 8 月 8 日创建