Импорт файла заголовка Rcpp в NAMESPACE в пакете R

Это мой первый пакет в R, у меня уже есть рабочий пакет, но я бы удалил некоторые функции перезаписи в файле cpp, поэтому я делаю заголовочный файл, который работает с одной функцией.

Как я могу поместить этот заголовок в пакет? Обратите внимание, что header.h и header.cpp находятся в каталоге src/ пакета, а #include "header.h" находится в файле .cpp, где я использую эту функцию.

Я попытался изменить файл NAMESPACE с помощью:

import(myheader) 

Но когда я сделаю:

R CMD INSTALL mypackage 

Я получаю эту ошибку:

Error: package or namespace load failed for 'mypackage' in namespaceExport(ns, exports):
 undefined exports: myheader

Как я могу решить эту ошибку?


person matteo antonucci    schedule 10.12.2019    source источник
comment
Почему вы хотите поместить это в NAMESPACE? Этот файл предназначен для импортируемых и экспортируемых функций R, а не для функций/заголовков C++/... Добавление файла в каталог src — это все, что нужно.   -  person Ralf Stubner    schedule 10.12.2019
comment
большое спасибо, я не подумал об этом !!   -  person matteo antonucci    schedule 10.12.2019
comment
Вы можете рассмотреть возможность просмотра некоторых примеров пакетов на CRAN. RcppExamples очевиден, есть много других, не слишком сложных.   -  person Dirk Eddelbuettel    schedule 10.12.2019


Ответы (1)


Как указал @RalfStubner в комментариях, файл NAMESPACE предназначен для экспорта и импорта функций и данных R.

Основное требование к NAMESPACE файлам в пакете, использующем Rcpp, — обеспечить:

  1. A single function from Rcpp package is imported for registration reasons.
    • Generally, either evalCpp or sourceCpp is used.
  2. Provide the name of the shared object via useDynLib(),
    • This is the name of the R package being built.
importFrom(Rcpp, sourceCpp)
useDynLib(<PACKAGE_NAME_HERE>, .registration = TRUE)

где <PACKAGE_NAME_HERE> — имя пакета без <>.


Если вы заинтересованы в использовании заголовков для совместного использования кода между пакетами R, рассмотрите возможность просмотра:

https://github.com/r-pkg-examples/rcpp-shared-cpp-functions

Основной шаблон проектирования использует каталог inst/include для размещения библиотеки только для заголовков. Затем в src/ пишем привязки к библиотеке. Убедитесь, что src/Makevars и src/Makevars.win имеют:

# Register where the header files for the package can be found
PKG_CXXFLAGS=-I../inst/include/

Если вы хотите совместно использовать определения функций в .cpp файлах в одном пакете R, см.:

https://github.com/r-pkg-examples/rcpp-headers-src

Это позволяет избежать единого монолитного файла .cpp, но не позволяет совместно использовать скомпилированные процедуры кода между пакетами R за пределами экспортируемой оболочки R.

person coatless    schedule 10.12.2019