Включение функции Python в пакет R без импорта всего пакета при каждом использовании функции - PullRequest
0 голосов
/ 10 октября 2019

Если я вызываю функцию в созданном мной пакете R, я добавляю к нему префикс с именем пакета, в котором он находится. Например, если я хочу использовать gam из пакета mgcv в функции myfunc моего пакета, я мог бы написать что-то вроде:

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

Теперь, скажем, я хочу использоватьФункция Python indexes из пакета peakutils. Я мог бы написать,

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

, но это будет импортировать весь пакет каждый раз, когда вызывается myfunc, что не идеально. Как правильно это сделать? Предположительно, Imports: в файле DESCRIPTION только для пакетов R. Или есть способ как-то его туда включить?

1 Ответ

0 голосов
/ 11 октября 2019

Решение состоит в том, чтобы import библиотека Python в функции .onLoad пакета обязательно указала 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. Подробное объяснение дано здесь .

...