使用.Call调用其他包函数时遇未定义对象C_runmin的问题
问题解答
报错原因
C_runmin是TTR包内部未导出的C++底层函数,只有在TTR包自己的命名空间里才能访问到。你把runMin的代码复制到全局环境自定义RunMin时,全局环境找不到这个仅对TTR包内部开放的函数,所以触发报错;而原TTR::runMin能正常运行,是因为它在TTR包的内部环境中调用这个函数,权限是够的。这不是环境配置问题,是函数可见性的问题。
C_runmin的位置
- 它是TTR包用Rcpp编译的底层函数,源代码在TTR包的
src目录下的C++文件里(比如命名类似runmin.cpp的文件)。 - 在R里可以用
getFromNamespace("C_runmin", "TTR")直接获取这个内部函数,但不推荐这么做——包的内部函数属于私有实现,版本更新时可能被修改或删掉,依赖它的自定义代码很容易出问题。
解决办法
- 要是只是想在原函数基础上加自定义逻辑,直接封装原函数就行:
RunMin <- function(x, n, ...) { # 先调用原函数获取结果 res <- TTR::runMin(x, n, ...) # 这里加你的自定义操作 res } - 真要修改原函数逻辑的话,先把内部的
C_runmin导入全局环境再用:# 先获取内部函数 C_runmin <- getFromNamespace("C_runmin", "TTR") # 再定义你的RunMin RunMin <- function (x, n = 10, cumulative = FALSE, na.rm = FALSE, ...) { # 粘贴你复制的原runMin代码 }
内容的提问来源于stack exchange,提问作者Dylan_Gomes
相关产品推荐
相关产品推荐

