Как правильно использовать useDynLib() в файле пространства имен пакета R

Хотя в Интернете существует несколько решений, я не нашел ни одного из подходящих для решения проблемы, с которой я сейчас сталкиваюсь (хотя, может быть, я просто слишком туп):

Я пытаюсь создать пакет R, который широко использует общий объект, скомпилированный Makefile (да, я знаю, что это плохая практика, но нельзя сказать, что файл Makevars нельзя скомпилировать код C и Fortran в один общий объект)) из кода в пакете src каталог. Неважно, где я собираю это. Так, чтобы (я попробовал src, libs и базовые папки пакета) или как я называю его (как одно из решений, упомянутых выше, утверждает, что оно должно называться так же, как пакет, в котором оно содержится), R CMD check выход с

** testing if installed package can be loaded
Error in library.dynam(lib, package, package.lib) : 
shared object ‘SoMNibEN.R.so’ not found

из-за useDynLib(SoMNibEN.R) инструкция в моем файле NAMESPACE (где SoMNibEN.R это имя моего пакета, но оно не работало с оригинальным именем)

Я предполагаю, что я использую это useDynLib() неверная команда или я делаю что-то не так с моим Makefile (хотя компиляция работает довольно хорошо и общий объект создается в папке моего проекта - я просто не знаю, успешно ли он был скопирован в каталог установки пакета).

Так что, если кто-нибудь знает, что я могу здесь делать неправильно, пожалуйста, дайте мне знать!

1 ответ

Решение

Вы хотите имя пакета в качестве аргумента, так как это имя общего объекта, созданного R, например useDynLib("chron"), Цитаты не являются обязательными (как они для library() так далее).

Я также рекомендую не использовать Makefile, а просто удалить файлы C и Fortran в src/ каталог. R обычно достаточно умен, чтобы знать, что делать. Если тебе надо -I и т.д. переключатели вы можете установить их там.

Наконец, используйте CRAN. Существуют сотни пакетов с скомпилированными исходниками, и некоторые из них обязательно будут похожи по структуре на ваш вопрос.

Другие вопросы по тегам