R语言如何对包含多个函数参数的字符串表达式求值?
问题背景
现有支持不定长自定义参数的API包装函数,使用时需要动态传入数量不固定的自定义参数,当前实现是将自定义参数拼接为逗号分隔的字符串,尝试通过eval(parse(text = ...))注入到函数调用中,触发解析错误。
错误复现
# 目标调用形式 my_function(arg1 = this, arg2 = that, period = 12, "0001q" %.d% c("1y", "2x", "3z"), "0002q" %.d% c("5u") ) # 拼接得到的自定义参数字符串 my_string <- "'0001q' %.d% c('1y', '2x', '3z'), '0002q' %.d% c('5u')" # 触发报错的写法 my_function(arg1 = this, arg2 = that, period = 12, eval(parse(text = noquote(my_string))) )
运行抛出错误:
Error in parse(text = ... unexpected ','
报错原因:parse()函数仅支持解析单个完整的R表达式,传入的字符串是逗号分隔的多个参数片段,不属于合法的单个表达式,因此解析失败。
可行实现方案
方案1:包裹为完整表达式后解析
将固定参数、目标函数和动态参数片段拼接为完整的函数调用字符串,此时整个字符串是单个合法R表达式,可正常解析求值:
# 拼接完整调用语句 full_expr <- paste0( "my_function(arg1 = this, arg2 = that, period = 12, ", my_string, ")" ) # 直接求值完整表达式 eval(parse(text = full_expr))
方案2:使用do.call传参(推荐)
完全规避字符串解析的风险,将固定参数、动态参数统一存入列表,通过do.call发起函数调用,适配任意数量的动态参数:
# 构造动态参数列表,可根据业务逻辑动态生成任意数量的参数项 dynamic_params <- list( "0001q" %.d% c("1y", "2x", "3z"), "0002q" %.d% c("5u") ) # 合并固定参数与动态参数 all_params <- c( list(arg1 = this, arg2 = that, period = 12), dynamic_params ) # 执行函数调用 do.call(my_function, all_params)
提示:如果动态参数本身需要从字符串生成,可对每个参数对应的字符串单独做
parse求值后再加入参数列表,不要将多个参数拼接为同一个字符串解析。
内容的提问来源于stack exchange,提问作者LoF10
相关产品推荐
相关产品推荐

