Я создаю пакет 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, поэтому подозреваю, что делаю глупости.