如何在rlang包中用quo("字符串")获取quo(符号)的quosure结果?
解决rlang中字符串转符号quosure的问题
嘿,我明白你的需求了——你希望输入带引号的字符串到quo()里,却得到和直接输入符号一样的quosure结果对吧?这其实是因为quo("just_an_example")和quo(just_an_example)的本质完全不同:前者是把字符串字面量包裹成quosure,后者是直接引用符号,所以输出自然有差异。
下面给你两种简单的解决方法,都能达到你想要的效果:
方法一:用sym()转换字符串为符号后注入
sym()函数可以把字符串转换成R的符号对象,再配合rlang的注入操作符!!(bang-bang),就能让quo()正确引用这个符号:
library(rlang) # 执行这行代码 quo(!!sym("just_an_example"))
运行后你会得到和quo(just_an_example)完全一致的结果:
<quosure: global> ~just_an_example
方法二:用parse_expr()解析字符串为表达式
如果你的需求更复杂(比如要解析更长的表达式字符串),可以用parse_expr()把字符串解析成表达式,再注入到quo()中:
quo(!!parse_expr("just_an_example"))
对于单个符号来说,这个方法和第一种效果一样,不过sym()更直接高效。
小补充
如果你是从变量中获取字符串,还可以用ensym()来简化操作,比如:
my_str <- "just_an_example" quo(!!ensym(my_str))
ensym()会自动把字符串变量转换成对应的符号,非常适合动态生成quosure的场景。
内容的提问来源于stack exchange,提问作者Rtist
相关产品推荐
相关产品推荐

