如何在R中使用美元符号实现非标准求值的自定义函数?
在R中结合美元符号($)与非标准求值实现自定义函数
你提到的需求是可以实现的,但直接写data${{var}}属于语法错误——R的$操作符不支持在右侧直接使用{{}}这种非标准求值语法,$要求右侧必须是一个直接的标识符(比如df$a里的a),而非表达式。
下面提供两种可行的实现方式:
方法1:使用rlang::inject()(推荐)
借助rlang包的inject()函数,可以将非标准求值的表达式注入到$操作的语法中:
library(rlang) df = data.frame(a = 1:3) fun2 <- function(data, var){ inject(data${{var}}) } # 调用测试 fun2(data = df, var = a) # [1] 1 2 3
inject()的作用是解析并替换括号内的{{var}},将其转换为传入的变量名符号,最终等价于执行data$a。
方法2:基础R实现(无需额外包)
如果不想依赖rlang,可以先将非标准求值的变量转换为字符串,再通过get()函数结合$的逻辑实现:
df = data.frame(a = 1:3) fun2 <- function(data, var){ var_name <- deparse(substitute(var)) get(var_name, data) } # 调用测试 fun2(data = df, var = a) # [1] 1 2 3
这里deparse(substitute(var))将传入的符号a转换为字符串"a",再用get()从数据框中提取对应变量的值,效果和$一致。
需要注意的是,基础R的$操作符本身不支持非标准求值的直接注入,所以必须通过上述方式间接实现;而你之前用dplyr::pull()的方案之所以可行,是因为pull()函数内部已经封装了对{{}}的支持。
内容的提问来源于stack exchange,提问作者zhiwei li
相关产品推荐
相关产品推荐

