在tibble中传递对象至函数后如何获取该对象名称?
解决tibble中无法捕获传入对象名称的问题
你遇到的问题根源是tibble::tibble()的非标准求值机制,它会改变substitute()的执行上下文,导致在其内部调用时拿不到外部传入的对象名,只能获取到参数名x。
下面是两个可行的解决办法:
方法一:提前捕获变量名
先在tibble构造前完成对象名称的捕获,再将结果传入tibble:
my_tibble <- function(x){ # 在tibble外部捕获传入的对象名 var_name <- deparse(substitute(x)) tibble::tibble(varname = var_name) } my_tibble(outcome) #> # A tibble: 1 × 1 #> varname #> <chr> #> 1 outcome
方法二:使用rlang的整洁评估工具
借助tibble依赖的rlang包提供的工具,直接捕获传入的符号并转换为字符:
my_tibble <- function(x){ tibble::tibble(varname = rlang::as_name(rlang::ensym(x))) } my_tibble(outcome) #> # A tibble: 1 × 1 #> varname #> <chr> #> 1 outcome
简单来说,原来的写法中deparse(substitute(x))是在tibble的参数内部执行的,tibble对参数做了上下文隔离,此时substitute(x)只能拿到参数名x;把捕获逻辑移到tibble外部,或者用专门的符号捕获工具,就能正确获取外部传入的对象名称了。
内容的提问来源于stack exchange,提问作者John-Henry
相关产品推荐
相关产品推荐

