r-自定义函数:返回一个tidyselect参数作为字符串,而不执行该参数



我想在我的自定义函数中创建一个段;evars";作为字符串返回,而不执行/评估参数。参数是一个tidyselect函数,用于从数据帧中提取指定的列。

简化的功能:

df <- data.frame(var1  = c("value_1", "value_2"),
var2.1 = c("value_1", "value_2"),
var2.2 = c("value_1", "value_2"),
var3 =  c("value_1", "value_2"))
customfunction <- function(df = df, evars = NULL){
df2 <- df %>% select({{evars}}) 
if(!is.null(evars)){paste(evars)}
} 

现在我希望它将参数作为字符串返回,而不执行它:

> customfunction(df = df, evars = c("var1",contains("2")))
[1] "c("var1",contains("2"))"

然而,现在它将返回:

Error: `contains()` must be used within a *selecting* function.
i See <https://tidyselect.r-lib.org/reference/faq-selection-context.html>.
Run `rlang::last_error()` to see where the error occurred.

如何使函数返回参数"的精确输入;evars";,而没有执行?

问题似乎是由于tidyselect函数contains((而发生的,例如,此代码没有导致错误:

> customfunction(df=df,evars=c("var1","var3"))
[1] "var1" "var3"

我们可以使用match.call()提取"evars">

customfunction <- function(df = df, evars = NULL){
v1 <- match.call()$evars
df2 <- df %>%
select({{evars}}) 

v1


} 

-测试

customfunction(df = df, evars = c("var1",contains("2")))
c("var1", contains("2"))

如果输出需要是字符串,则使用capture.output包装

customfunction <- function(df = df, evars = NULL){
v1 <- capture.output(match.call()$evars)
df2 <- df %>%
select({{evars}}) 

v1


} 
customfunction(df = df, evars = c("var1",contains("2")))
[1] "c("var1", contains("2"))"

最新更新