Краткий ответ
Это нормально, что я должен это сделать?
Нет .Если path/to/package
является каталогом, в котором вы разрабатываете свой пакет, и у вас все настроено для того, чтобы ваш пакет правильно вызывал подпрограммы на Фортране (см. «Длинный ответ»), вы можете запустить
R CMD build path/to/package
в командной строке, и для вас будет создан тарбол со всем в нужном месте (обратите внимание, вам понадобится Rtools для этого).Тогда вы сможете запустить
R CMD check packagename_versionnumber.tar.gz
из командной строки, чтобы проверить ваш пакет, без каких-либо проблем (вытекающих из того, что файлы .dll
находятся в неправильном месте - у вас могут быть другие проблемы, вв этом случае я бы предложил задать новый вопрос с ошибкой, предупреждением или примечанием, перечисленными в вопросе).
Если вы предпочитаете работать только с R, вы можете даже
devtools::check("path/to/package")
без необходимости запускать devtools::build()
или R CMD build
("devtools :: check () ... [b] отменяет пакет перед проверкой") - глава Хадли о проверке ; см. также Карл Броман глава о проверке ).
Длинный ответ
Я думаю, что ваш вопрос потенциально связан с тремя проблемами:
- Разница между каталогамиструктура пакетов до и после их установки.(Вы можете прочитать раздел «Что такое пакет?» Главы Структура пакета Хэдли - к счастью
R CMD build
в командной строке или devtools::build()
в R позаботится об этом за вас) - Использование
INSTALL
против BUILD
(из комментариев к исходной версии этого ответа) - Правильный способ настройки пакета для вызова подпрограмм Fortran.
Возможно, вам понадобится немало советов по процессу разработки пакетов R.Некоторые хорошие руководства включают (в порядке возрастания детализации):
- Пакетный праймер Карла Бромана R
- Пакеты Хэдли Уикхема R
- Расширения Writing R manual
В частности, есть некоторые подробности о скомпилированном коде в пакете R, о которых вы, возможно, захотите знать.Возможно, вы захотите сначала прочитать главу Хэдли о скомпилированном коде (у Broman его нет), но затем вам действительно нужно прочитать большую часть руководства по Writing R Extensions, в частности разделы 1.1, 1.2, 1.5.4 и 1.6, и все главы 5 и 6.
Тем временем я настроил репозиторий GitHub здесь , который демонстрирует игрушечный пример пакета R FortranExample
, который показываетКак правильно настроить пакет с кодом Fortran.Я предпринял следующие шаги:
- Создайте базовую структуру пакета, используя
devtools::create("FortranExample")
. - Удалите строку «Зависит» в
DESCRIPTION
, так как она устанавливает зависимость от R> = 3.5.1, который выдает предупреждение при проверке (теперь я также изменил поле «Лицензия», чтобы исключить предупреждение о том, что не указана правильная лицензия). - Создайте каталог
src/
и добавьтеТам есть код Fortran (он просто удваивает двойное значение). - Используйте
tools::package_native_routine_registration_skeleton("FortranExample")
, чтобы сгенерировать код регистрации символа, который я поместил в src/init.c
(см. Запись расширений R, раздел 5.4). - Создайте красивую оболочку R для использования
.Fortran()
для вызова кода Фортрана (помещен в R/example_function.R
). - В этом же файле используйте тег
#' @useDynLib FortranExample
Roxygen для добавления useDynLib(FortranExample)
к *Файл 1095 *;если вы не используете Roxygen, вы можете поместить его туда вручную (см. Writing R Extensions 1.5.4 и 5.2).
Теперь у нас есть пакет, который правильно настроен для работы с кодом Fortran,Я проверил на компьютере Windows (под управлением Windows 8.1 и R 3.5.1) как пути запуска
R CMD build FortranExample
R CMD check FortranExample_0.0.0.9000.tar.gz
из командной строки, так и запуска
devtools::check("FortranExample")
из RОшибок не было, и единственным предупреждением была упомянутая выше проблема «Лицензия».
После устранения последствий запуска devtools::check("FortranExample")
(по какой-то причине опция cleanup
устарела;см. ниже функцию R, чтобы справиться с этим для вас, вдохновленный devtools::clean_dll()
), я использовал
devtools::install("FortranExample")
для успешной установки пакета и проверки его функции, получая:
FortranExample::example_function(2.0)
# [1] 4
Упомянутая мной функция очистки
clean_source_dirs <- function(path) {
paths <- file.path(path, paste0("src", c("", "-i386", "-x64")))
file_pattern <- "\\.o|so|dll|a|sl|dyl"
unlink(list.files(path = paths, pattern = file_pattern, full.names = TRUE))
}