You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用字符串参数调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:24:53