编写支持管道的R函数test:获取数据框或其列表的名称
解决方案:实现支持管道的test函数
要满足需求,我们需要利用**非标准计算(NSE)**捕获输入的原始表达式,再根据表达式类型分别处理数据框和列表场景:
test <- function(object) { # 获取传入的原始表达式 input_expr <- substitute(object) # 处理数据框列表输入:提取list调用中的每个参数并转为字符串 if (is.call(input_expr) && input_expr[[1]] == quote(list)) { return(sapply(input_expr[-1], deparse)) } # 处理单个数据框输入:直接转为变量名字符串 else if (is.symbol(input_expr)) { return(deparse(input_expr)) } # 非法输入处理 else { stop("输入必须是单个数据框或数据框列表") } }
测试验证
# 单个数据框,使用|>管道 iris |> test() # 输出: [1] "iris" # 数据框列表,使用|>管道 list(iris, mtcars) |> test() # 输出: [1] "iris" "mtcars" # 支持dplyr的%>%管道 library(dplyr) iris %>% test() # 输出: [1] "iris" list(iris, mtcars) %>% test() # 输出: [1] "iris" "mtcars"
代码说明
substitute(object):捕获传入函数的原始表达式(而非计算后的值),因为数据框本身不存储自身的变量名,必须从表达式中提取。- 列表场景判断:通过
is.call(input_expr)识别list()调用,再提取list()内的每个参数,用deparse()转为对应的变量名字符串。 - 单个数据框场景:通过
is.symbol(input_expr)识别单个变量名,直接转为字符串返回。
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

