问题描述
除非在另一个函数中调用该函数(见下文),否则它可以正常工作。
library(reprex)
print_data_1 <- function(DATA) {
DATA_txt <- deparse(substitute(DATA))
print(DATA_txt)
}
print_data_2 <- function(DF) {
print_data_1(DF)
}
print_data_1(mi_d)
#> [1] "mi_d"
print_data_2(mi_d)
#> [1] "DF"
print_data_2
应该返回“mi_d”。
由 reprex package (v2.0.0) 于 2021 年 5 月 14 日创建
解决方法
这是一种使用 rlang
的方法。这东西很快就变得非常先进了。
library(rlang)
print_data_1 <- function(DATA) {
.DATA <- enquo(DATA)
.DATA_txt <- as_name(.DATA)
print(.DATA_txt)
}
print_data_2 <- function(DF) {
.DF <- enquo(DF)
print_data_1(!!.DF)
}
print_data_1(mi_d)
#> [1] "mi_d"
print_data_2(mi_d)
#> [1] "mi_d"
等等...
print_data_3 <- function(X) {
.X <- enquo(X)
print_data_2(!!.X)
}
print_data_3(mi_d)
#> [1] "mi_d"
-
enquo()
将引用用户参数。 -
!!
会将参数取消引用到函数中。 -
as_name()
会将引用的参数转换为字符。
cheatsheet 和 rlang
小插曲非常有用。
要取回该对象的值,您可以在 quosure 上使用 eval_tidy()
。
print_data_1 <- function(DATA) {
.DATA <- enquo(DATA)
.DATA_txt <- as_name(.DATA)
df <- eval_tidy(.DATA)
print(.DATA_txt)
df
}
print_data_2(mtcars)