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

如何在不加载包的情况下用do.call调用R的包限定函数?

用do.call调用带包名限定的函数(无需显式加载包)

当尝试用do.call调用带包名前缀(如numDeriv::hessian)的函数时,直接传入带引号的包限定函数名会报错,但直接调用该函数或者显式加载包后调用do.call却能正常运行。示例代码如下:

fn = function(x) sin(x[1]) + cos(x[2])
x0 = c(pi/2, pi/2)

# 直接调用包限定函数正常运行
numDeriv::hessian(func = fn, x = x0)
##               [,1]          [,2]
## [1,] -1.000000e+00 -5.910744e-13
## [2,] -5.910744e-13  1.063389e-15

# 用do.call传入带引号的包限定函数名报错
do.call("numDeriv::hessian", list(func = fn, x = x0))
## Error in `numDeriv::hessian`(f = function (x)  : 
##   could not find function "numDeriv::hessian"

# 显式加载包后,do.call调用函数名正常运行
library(numDeriv)
do.call("hessian", list(func = fn, x = x0))
##               [,1]          [,2]
## [1,] -1.000000e+00 -5.910744e-13
## [2,] -5.910744e-13  1.063389e-15

实际场景中需要通过包名字符串和函数名字符串拼接来调用,去掉引号直接传入numDeriv::hessian的方案无法满足需求,此时可以通过以下方式解决:

通过do.call的envir参数指定函数所在包的命名空间,无需显式加载包即可实现调用。代码如下:

fn = function(x) sin(x[1]) + cos(x[2])
x0 = c(pi/2, pi/2)

lib <- "numDeriv"
routine <- "hessian"

do.call(routine, list(func = fn, x = x0),
        envir = asNamespace(lib))
##               [,1]          [,2]
## [1,] -1.000000e+00 -5.910744e-13
## [2,] -5.910744e-13  1.063389e-15

内容的提问来源于stack exchange,提问作者Hans W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:10:08