Почему roxygen2 автоматически не обновляет "Импорт" в файле DESCRIPTION?
Я стараюсь внимательно следить за @hadley book, чтобы узнать лучшие практики написания пакетов R. И я был в восторге, прочитав эти строки о философии книги:
все, что может быть автоматизировано, должно быть автоматизировано. Сделайте так же мало, как возможно вручную. Сделайте как можно больше функций.
Итак, когда я читал о зависимостях и (вроде) запутывающих различиях между директивами импорта в файле NAMESPACE и поле "Импорт:" в файле DESCRIPTION, я надеялся, что roxygen2
будет автоматически обрабатывать оба из них, После всего
Каждый пакет, указанный в NAMESPACE, также должен присутствовать в Импортирует или Зависит.
Я надеялся, что roxygen2
будет использовать каждый @import в моих функциях и убедиться, что он включен в файл DESCRIPTION. Но это не делает это автоматически.
Поэтому я либо должен добавить его вручную в файл DESCRIPTION, либо почти вручную, используя devtools::use_package
.
Оглядываясь на ответ, я нашел это question в SO, где @hadley подтверждает в комментариях, что
В настоящее время робот пространства имен будет изменять NAMESPACE, но не ОПИСАНИЕ
и другие сообщения (например здесь или здесь), где collate_roclet
, но "Это имеет значение только в том случае, если ваш код имеет побочные эффекты, чаще всего потому, что вы используете S4 ".
Интересно:
- причина, по которой ОПИСАНИЕ не обновляется автоматически (что противоречит вышеупомянутой философии, которая, по-видимому, разделяется
roxygen2
) и
- Если кто-то уже создал способ сделать это
Ответы
Ответ 1
namespace_roclet
редактирует файл NAMESPACE
на основе тегов, добавленных в script перед функцией. Поскольку существует три типа зависимостей (Depends
, Imports
и Suggests
), аналогичный метод, используемый namespace_roclet
, потребует трех разных тегов (уведомление Imports
должно быть другим, чтобы различать это из пакетов для прикрепления в NAMESPACE
).
Если вы хотите выполнить полуавтоматический процесс, вы можете определить используемые вами пакеты и добавить отсутствующие в DESCRIPTION
в соответствующие разделы.
library(reinstallr)
package.dir <- getwd()
base_path <- normalizePath(package.dir)
files <- list.files(file.path(base_path, "R"), full.names = TRUE)
packages <- unique(reinstallr:::scan_for_packages(files)$package)
packages
Ответ 2
Относительно двух пуль, о которых вы задумываетесь в нижней части:
- Обновления файла DESCRIPTION могут быть дополнительно автоматизированы с помощью дополнительных roclets, однако уже > 4 года назад такой запрос на перенос был отложен:
https://github.com/klutometis/roxygen/pull/76
- Я должен предположить, что ребята действительно предпочли бы, чтобы вы использовали пакет
devtools
для обновления файла DESCRIPTION вместо того, чтобы добавлять его к roxygen2
. Таким образом, в этом смысле devtools
станет первым доступным выбором