如果我在我创建的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包。或者,有没有办法把它包含在那里?
发布于 2019-10-11 18:43:47
解决方案是在包的.onLoad函数中import 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给出了详细的解释。
https://stackoverflow.com/questions/58327969
复制相似问题