在 R 包中包含 Python 函数,而无需在每次使用该函数时导入整个包

Including a Python function in an R package without importing the entire package each time the function is used

如果我在我创建的 R 包中调用一个函数,我会在它前面加上它所在的包名称作为前缀。例如,如果我想在我的包的 myfunc 函数中使用 mgcv 包中的 gam,我可以这样写,

myfunc <- function(y, x, df){
    mgcv::gam(y ~ s(x), data = df)
}

现在,假设我想使用包 peakutils 中的 Python 函数 indexes。我会写,

myfunc <- function(y){
    pu <- reticulate::import("peakutils")
    pu$indexes(y)
}

但是每次调用 myfunc 时都会导入整个包,这并不理想。这样做的正确方法是什么?据推测,DESCRIPTION 文件中的 Imports: 仅适用于 R 包。或者有没有办法以某种方式将它包含在那里?

解决办法是import包的.onLoad函数中的Python库一定要指定delay_load = TRUE.

例如,

# Global reference to peakutils package - initialized in .onLoad
peakutils <- NULL

# Called upon loading the package
.onLoad <- function(libname, pkgname) {
  # Use superassignment to update global reference to peakutils
  peakutils <<- reticulate::import("peakutils", delay_load = TRUE)
}

虽然这会加载整个包,但它只会加载一次,而不是每次都需要 Python 库中的一个函数。给出了详尽的解释here