Альтернативные библиотечные функции (включая код C ++), назначенные во время .onLoad в пакете R - PullRequest
0 голосов
/ 21 февраля 2019

Я создаю пакет R, используя devtools, который использует одну функцию (скажем, f()) из другого пакета (скажем, pkg_X).Но pkg_X довольно тяжелый и зависит от всех видов графических библиотек, которые не нужны для функции, которую я хочу.Тем не менее, он распространяется в рамках MIT, поэтому я могу извлечь необходимые функции и вставить их в свой пакет.

Однако я считаю, что в этом нет необходимости, если пользователь уже установил pkg_X для какого-то другогопричина.Поэтому я хочу проверить require("pkg_X") во время функции .onLoad() моего пакета, и, если она не работает, определить мою собственную версию f().

Еще одна проблема заключается в том, что f() также зависит от некоторого кода C ++, доступ к которому можно получить с помощью Rcpp::sourceCpp().Поэтому в данный момент в функции .onLoad я делаю что-то вроде этого (скопировано с https://community.rstudio.com/t/build-package-namespace-dynamically-during-onload/4101)

## for NAMESPACE exporting
f <- NULL
cpp_func <- NULL

.onLoad <- function(lib, pkg, ...) {
  if (!suppressWarnings(require("pkg_X", character.only = TRUE))) {
    require(Rcpp)
    sourceCpp("alt_dir/mycppfile.cpp") #defines cpp_func()
    cpp_func <<- cpp_func #make globally accessible
    source("alt_dir/my_r_code.R") #defines f()
    f <<- f #make globally accessible
  }
}

Где mycppfile.cpp и my_r_code.R присутствуют в alt_dir каталог в моем пространстве пакета.

Я уверен, что это неправильно - например, когда я делаю devtools::install("my_package") на моем Mac, он работает в настоящее время, но не устанавливает mycppfile.cppи my_r_code.R файлы в нужное место, так что library(my_package) не удается.

Как правильно сделать это?Я раньше не занимался разработкой пакетов для R, поэтому подозреваю, что делаю глупости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...