Я хочу собрать пакет R cpp с кодом C ++ и R. Только с кодом C ++ (удаленный код R) все компилируется и работает хорошо, и после сборки и загрузки экспортируемые функции могут вызываться, как и ожидалось, как
<packageName>::<functionName>()
Однако при включении кода R с вызовом В коде C ++ при создании пакета возникает ошибка: объект не найден:
R CMD build <packageName>
[...]
** R
** byte-compile and prepare package for lazy loading
Error in <functionName>() :
object '_<packageName>_<functionName>' not found
Error: unable to load R code in package '<packageName>'
Ошибка возникает после успешной компиляции кода C ++.
<functionName>()
отображается как
_<packageName>_<functionName>
в R/RcppExports.R
как обычно, но не похоже, что он может быть загружен кодом R во время сборки.
Структура пакета обычна:
<packageName>
├── DESCRIPTION
├── man
│ ├── <functionName>.rd
│ └── <packageName>-package.rd
├── NAMESPACE
├── R
│ ├── <RCodeFileName>.R
│ └── RcppExports.R
├── README.md
└── src
├── <C++CodeFileName>.cpp
├── <C++CodeFileName>.o
├── <packageName>.so
├── RCppExports.cpp
├── RCppExports.o
└── symbols.rds
, где при компиляции пакета создаются файлы .o
и .so
.
Файл R вызывает функцию из Файл C ++ напрямую:
[other stuff]
[...]
<functionName>()
NAMESPACE
Файл также как обычно:
useDynLib(<packageName>, .registration=TRUE)
importFrom(Rcpp, evalCpp)
exportPattern("^[[:alpha:]]+")
Это кажется очень простой и прямой проблемой (вызов кода C ++ из кода R в пакет R cpp). Тем не менее, мне кажется, что я не могу найти никаких указаний на то, как это должно быть сделано.
Редактировать (8 апреля 2020 г.): build
против INSTALL
Проблема возникает в каждом случае для
R CMD INSTALL <packageName>_<version>.tar.gz
Если включенный файл справки
man/<packageName>-package.Rd
построен так, что он вызывает installing the package to process help pages
, ошибка уже возникнет в
R CMD build <packageName>
, как описано выше.
Редактировать (8 апреля 2020 г.): шаги для воспроизведения с Rcpp.package.skeleton()
(в любом случае на Unix -подобных системах)
Rscript -e 'Rcpp::Rcpp.package.skeleton("demo20200408")'
echo 'rcpp_hello_world()' > errorDemo/R/example.R
R CMD INSTALL errorDemo