在 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。
如果我在我创建的 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。