首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义函数:将tidyselect参数作为字符串返回,而不执行参数。

自定义函数:将tidyselect参数作为字符串返回,而不执行参数。
EN

Stack Overflow用户
提问于 2022-02-28 14:51:34
回答 1查看 41关注 0票数 2

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

简化函数:

代码语言:javascript
复制
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)}
} 

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

代码语言:javascript
复制
> customfunction(df = df, evars = c("var1",contains("2")))
[1] "c("var1",contains("2"))"

然而,现在它将返回:

代码语言:javascript
复制
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函数in ()而发生的,例如,这段代码不会导致错误:

代码语言:javascript
复制
> customfunction(df=df,evars=c("var1","var3"))
[1] "var1" "var3"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-28 15:36:07

我们可以使用match.call()并提取“evars”

代码语言:javascript
复制
customfunction <- function(df = df, evars = NULL){
   v1 <- match.call()$evars
   df2 <- df %>%
     select({{evars}}) 
     
     v1
  
   
} 

-testing

代码语言:javascript
复制
customfunction(df = df, evars = c("var1",contains("2")))
c("var1", contains("2"))

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

代码语言:javascript
复制
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\"))"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71296811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档