如何用字符串参数调用R的fn_env(),支持::符号?
解决方案
要实现接收字符串形式函数名(含::前缀)的my_fn_env函数,核心是先将字符串解析为对应的函数对象,再传入fn_env。以下是两种可行实现方式:
方式一:使用rlang包(推荐)
rlang提供了更安全的表达式解析与求值工具,能轻松处理带命名空间的函数名:
library(rlang) my_fn_env <- function(fn_str) { # 解析字符串为R表达式 fn_expr <- parse_expr(fn_str) # 求值得到函数对象 fn_obj <- eval_tidy(fn_expr) # 返回函数的环境 fn_env(fn_obj) }
测试示例
# 先加载plyr包 library(plyr) # 验证结果一致性 identical(my_fn_env("plyr::count"), fn_env(plyr::count)) # 返回TRUE identical(my_fn_env("count"), fn_env(count)) # 当count在当前环境存在时返回TRUE
方式二:仅使用base R
如果不想依赖rlang,可通过base R的parse()和eval()实现:
my_fn_env <- function(fn_str) { # 解析字符串为单个表达式 fn_expr <- parse(text = fn_str)[[1]] # 在全局环境中求值得到函数对象 fn_obj <- eval(fn_expr, envir = globalenv()) # 调用rlang的fn_env(若用base R的environment(),效果类似但返回的环境对象细节有差异) rlang::fn_env(fn_obj) }
原问题原因说明
- 你之前用
do.call("fn_env", list("plyr::count"), quote=FALSE)无效,是因为fn_env需要接收函数对象而非字符串,字符串无法直接被解析为函数。 - 《Advanced R》中的
where()函数默认仅处理单个符号(如count),无法解析plyr::count这种带命名空间的调用表达式,因此需要先将字符串转为完整表达式再求值。
内容的提问来源于stack exchange,提问作者Denis Cousineau
相关产品推荐
相关产品推荐

