R语言嵌套函数场景下提取参数名称为字符串的问题求助
R嵌套函数调用时提取最外层实参名的解决方案
你遇到的问题是R基础函数substitute()的默认解析规则导致的:substitute()仅会在当前调用帧的环境中解析符号,嵌套调用时内层函数只能拿到外层函数的形参符号,无法直接获取最外层用户传入的实参名。以下是两种简单可行的解决方案:
方案1:Base R 无额外依赖方案(适配两层嵌套场景)
无需安装第三方包,仅修改外层函数,用do.call传递外层已经解析好的符号即可:
print_data_1 <- function(DATA) { DATA_txt <- deparse(substitute(DATA)) print(DATA_txt) } # 仅修改外层函数 print_data_2 <- function(DF) { do.call(print_data_1, list(substitute(DF))) } # 测试 mi_d <- data.frame() print_data_1(mi_d) #> [1] "mi_d" print_data_2(mi_d) #> [1] "mi_d"
方案2:通用嵌套场景方案(适配任意嵌套层数)
如果存在多层嵌套调用的需求,推荐用rlang包的非标准求值工具实现,仅需修改内层函数,外层函数无需做任何调整:
# 未安装rlang可先运行 install.packages("rlang") library(rlang) # 仅修改内层函数 print_data_1 <- function(DATA) { # ensym会自动沿调用栈向上追溯,捕获最原始的实参符号 DATA_txt <- as_label(ensym(DATA)) print(DATA_txt) } print_data_2 <- function(DF) { print_data_1(DF) } # 多层嵌套也可正常返回结果 print_data_3 <- function(x) { print_data_2(x) } # 测试 mi_d <- data.frame() print_data_1(mi_d) #> [1] "mi_d" print_data_2(mi_d) #> [1] "mi_d" print_data_3(mi_d) #> [1] "mi_d"
内容的提问来源于stack exchange,提问作者Samuel Saari
相关产品推荐
相关产品推荐

