如何在不加载包的情况下用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.
相关产品推荐
相关产品推荐

