R语言如何使用字符串插值动态加载包内数据?
实现方案
该需求可以实现,你之前的写法失败是因为没有正确处理R的命名空间访问语法与符号求值的逻辑。
最优实现(无eval、最安全)
直接用R内置的getExportedValue函数,专门用于从指定包中获取导出对象,完全不需要碰字符串解析或求值逻辑:
r[[glue("fic_{data}")]] <- getExportedValue("fic", data)
这个方法没有注入风险,性能也比eval类方案好,优先推荐。
如果你需要用rlang的sym/!!语法实现
要注意::是R的二元运算符,不能直接把包名::对象名整串转成符号,需要分别生成包名和对象名的符号再拼接成命名空间访问表达式:
library(rlang) r[[glue("fic_{data}")]] <- inject(!!sym("fic")::!!sym(data))
这里inject会把两个!!对应的符号注入到::运算的表达式中,正确完成包对象的访问。
错误写法原因说明
eval(glue("fic::{data}")):glue返回的是普通字符串,eval默认不会把字符串当做代码表达式解析,只会直接返回字符串本身,自然无法得到目标对象eval(sym(glue("fic::{data}"))):sym会把整串fic::xxx当做单个变量名处理,而不是「访问fic包下的xxx对象」,全局环境中不存在这个名称的变量所以报错eval(glue("fic::{!!data}")):!!是rlang的元编程操作符,仅在rlang的求值上下文生效,不能在glue的字符串插值语法中使用,所以这个写法本身就不符合语法规则
内容的提问来源于stack exchange,提问作者msm1089
相关产品推荐
相关产品推荐

