R语言中如何将函数参数保存为字符型变量?解决deparse处理数据框返回错误的问题
解决R语言中捕获函数参数名/表达式的问题
你遇到的问题是因为deparse()直接处理的是参数求值后的结果,而不是你调用函数时传入的原始表达式。比如传入dataframe时,deparse()会把整个数据框的内容展开,而不是返回变量名的字符串。
要获取调用时传入的参数表达式(比如a ~ b或者dataframe这些字面量),你需要先用substitute()捕获参数的原始表达式,再用deparse()转成字符串。修改后的代码如下:
dataframe <- data.frame(a=c(1, 2, 3), b=c(3, 6, 8)) afunction <- function(arg1, arg2) { # 先捕获原始表达式,再转成字符串 arg1_character <- deparse(substitute(arg1)) arg2_character <- deparse(substitute(arg2)) # 返回结果方便查看 list(arg1 = arg1_character, arg2 = arg2_character) } # 测试调用 result <- afunction(a ~ b, dataframe) print(result$arg1) # 输出: "a ~ b" print(result$arg2) # 输出: "dataframe"
为什么这能生效?
substitute(arg1)会获取你调用函数时传入的未求值的表达式,比如调用afunction(a ~ b, dataframe)时,它会把arg1替换成a ~ b这个公式对象的表达式,arg2替换成dataframe这个变量名的表达式。- 再用
deparse()把这个表达式转换成字符串,就得到了你期望的参数字面量文本。
扩展测试:复杂参数也能正确捕获
如果传入更复杂的参数,这个方法依然有效:
result2 <- afunction(a ~ log(b), dataframe[1:2, ]) print(result2$arg1) # 输出: "a ~ log(b)" print(result2$arg2) # 输出: "dataframe[1:2, ]"
这样就能完美满足你把函数参数保存为对应字符串变量的需求啦!
内容的提问来源于stack exchange,提问作者OLGJ
相关产品推荐
相关产品推荐

