Проблемы компиляции Rpackage: ошибка в asNamespace (ns) с использованием Rcpp - PullRequest
7 голосов
/ 27 апреля 2020

Работа с небольшим пакетом R cpp для использования Boost и некоторых его геометрических функций в C.

Закончили написание функций и все работало хорошо. Проверено, что все работало правильно (Clean and Rebuild и тестирование функций) в последний раз, прежде чем перейти на GitHub. После того, как я дважды проверил, что каталог был полностью сохранен в GitHub, я удалил каталог со своего локального компьютера. Следует также отметить, что у меня на этом работает Roxygen2, который управляет файлом NAMESPACE.

При клонировании каталога назад и Clean and Rebuild я получаю следующую ошибку:

==> Rcpp::compileAttributes()

* Updated R/RcppExports.R

==> R CMD INSTALL --preclean --no-multiarch --with-keep.source MinimumRcpp

* installing to library ‘/Library/Frameworks/R.framework/Versions/3.5/Resources/library’
* installing *source* package ‘MinimumRcpp’ ...
clang++ -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG  -I"/Library/Frameworks/R.framework/Versions/3.5/Resources/library/Rcpp/include" -I/usr/local/include   -fPIC  -Wall -g -O2 -c RcppExports.cpp -o RcppExports.o
** libs
clang++ -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG  -I"/Library/Frameworks/R.framework/Versions/3.5/Resources/library/Rcpp/include" -I/usr/local/include   -fPIC  -Wall -g -O2 -c findParetoSet.cpp -o findParetoSet.o
clang++ -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG  -I"/Library/Frameworks/R.framework/Versions/3.5/Resources/library/Rcpp/include" -I/usr/local/include   -fPIC  -Wall -g -O2 -c kintersection.cpp -o kintersection.o
clang++ -std=gnu++11 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o MinimumRcpp.so RcppExports.o findParetoSet.o kintersection.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
installing to /Library/Frameworks/R.framework/Versions/3.5/Resources/library/MinimumRcpp/libs
** R
** byte-compile and prepare package for lazy loading
Error in asNamespace(ns) : not a namespace
Error : unable to load R code in package ‘MinimumRcpp’
ERROR: lazy loading failed for package ‘MinimumRcpp’
* removing ‘/Library/Frameworks/R.framework/Versions/3.5/Resources/library/MinimumRcpp’

Exited with status 1.

Конечно, в коде ничего не изменилось. Однако у меня есть следующие .gitignore файлы:

# /.gitignore
inst/lib
.Rproj.user     ## Could this be an issue? 
.Rproj.user/    ## Could this be an issue? 
.Rproj.user/**  ## Could this be an issue? 
src/*.o
src/*.so
src/*.dll
src/symbols.rds
.Rhistory
.RData
.DS_Store

## QtCreator
Rcpp.pro
Rcpp.pro.user
*.autosave
.#*

*.tar.gz

vignettes/*_cache

## GNU global
GPATH
GRTAGS
GTAGS

##
local/

## docker helpers
docker/*sh
docker/*/*.sh
# /.Rbuildignore
debian
inst/doc/html
inst/doc/latex
inst/doc/man
inst/doc/jss.bst
vignettes/jss.bst
^.*\.Rproj$
^\.Rproj\.user$
vignettes/notyet
doxyfile
\.travis\.yml
\.dir-locals\.el
\.clang_format
vignettes/getCurrentVersionsOfCitedPackages.R
^Contributing.md$
^\.codecov\.yml$
inst/include/Rcpp.h.new
inst/include/Rcpp.h.old
LICENSE
.*\.tar\.gz$
\.editorconfig
docker
^GPATH
^GRTAGS
^GTAGS
^local
vignettes/Makefile
vignettes/rmd
\.github

Возможно ли, что некоторые данные пакета, которые были необходимы для сборки пакета, остались позади и вызывают текущие проблемы?

Любая помощь будет принята с благодарностью. Кроме того, любой совет о том, как отладить это, помог бы, так как текущие выходные сообщения довольно туманны и оставляют меня без направления.

Вот репозиторий GitHub для воспроизводимости: https://github.com/eduardoRubioG/MinimumRcpp

1 Ответ

9 голосов
/ 28 апреля 2020

Ладья ie ошибка, но серьезная:

  • никогда никогда Храните файлы скриптов в вашем R/ каталоге

  • все (и мы имеем в виду все ) в каталоге получает источник (при условии, что оно выглядит как код R, _i.e. Заканчивается .R)

  • вы оставили сценарий с вызовом library(MinimumRcpp), поэтому теперь ваша компиляция байт-кода пакета хочет получить исходный код -> не очень хороший план

  • короче, продолжайте такие сценарии, но поместите их в например local/ и исключите local/ через .Rbuildignore.

Плюс важный урок стиля

  • не оставляйте rm(list = ls(all = TRUE)) в своем коде

Так что если вы сделаете mv R/script.R R/script.R.txt и восстановите, все будет хорошо.

(я получаю полдюжины предупреждений, потому что n - это не size_t, но по сравнению с единицей. Вы можете разыграть его раньше.)

...