Предстоящие NAMESPACE, Зависит, Импортирует изменения для 2.14.0 (некоторые определения / используйте, пожалуйста) - PullRequest
12 голосов
/ 24 октября 2011

Если вы являетесь автором пакета, мы надеемся, что вы хорошо знаете о предстоящих изменениях в структуре пакета, когда мы перейдем на 2.14 примерно через неделю. Одним из изменений является то, что для всех пакетов потребуется NAMESPACE, и один из них будет создан для вас, если вы его не создадите (эквивалент R ваших прав на Miranda в США). Так что, будучи хорошим гражданином, я пытался понять это. Вот раздел из R-exts:

1.6.5 Сводка - преобразование существующего пакета

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

Определите публичные определения и поместите их в директивы экспорта. Определите определения метода в стиле S3 и напишите соответствующий метод S3 деклараций. Определите зависимости и замените все требуемые вызовы директивы импорта (и внести соответствующие изменения в зависимости и Импортирует поля из файла DESCRIPTION). Замените .First.lib функции с функциями .onLoad или директивами useDynLib.

Чтобы убедиться, что я все делаю правильно, может кто-нибудь дать краткое четкое определение / ответ (нарушаю ли я правило, имея несколько небольших, но связанных между собой вопросов?). Все ответы должны быть приняты во внимание 2.14, пожалуйста:

  1. Определение NAMESPACE, используемое R
  2. Есть ли способ сгенерировать NAMESPACE перед сборкой и проверкой, или мы выполняем один раз ч / б, а затем редактируем NAMESPACE, созданный автоматически?
  3. Разница между "Зависит от" и "Импорт:" в файле ОПИСАНИЕ. В частности, зачем мне помещать пакет в «Зависит от»: вместо «Импорт:» или наоборот?
  4. Звучит так, будто «требуется» больше не используется, хотя и не говорит этого Это правильная интерпретация?

Спасибо!

Ответы [ 4 ]

8 голосов
/ 24 октября 2011

Я немного написал по этой теме на https://github.com/hadley/devtools/wiki/Namespaces.

Чтобы ответить на ваши вопросы:

  1. См. Ответ Дирка.
  2. Использовать roxygen2
  3. Теперь, когда у каждого пакета есть пространство имен, нет особых причин использовать Depends.
  4. require следует использовать только для загрузки предложенных пакетов
7 голосов
/ 24 октября 2011

Пакеты CRAN имеют NAMESPACE с почти бессмертного времени.Просто выберите несколько ваших любимых пакетов CRAN и посмотрите их файлы NAMESPACE.

Это может быть так же просто, как этот однострочный (плюс комментарий) из snow :

# Export all names unless they start with a dot
exportPattern("^[^.]")

Запустите R CMD check как обычно, и в большинстве случаев у вас все будет хорошо.

4 голосов
/ 24 декабря 2011

Я собираюсь ответить на свой вопрос с несколькими деталями, которые я узнал после переключения нескольких пакетов на R 2.14.

Приведенное выше описание из своего рода руководства создает впечатление, что все, что у вас былов зависимости от: для R 2.13 следует перенести на импорт: в R 2.14.Вы должны сделать это, но функционально они не равны 1 к 1, как я надеюсь, будет ясно из примечаний ниже.

Здесь мы говорим:

Зависит: вероятно, должно бытьиспользуется только для ограничений версий, таких как 'R> = 2.10' или 'MASS> 0.1' и ничего более в соответствии с R 2.14.

Наличие пространства имен является механизмом уведомления пользователей о том, что могут возникнуть конфликты имен и«замены» - другими словами перезапись используемых имен.Файл NAMESPACE должен совпадать в элементах и ​​порядке поля Imports: в DESCRIPTION.Имена импортированных функций и т.д. будут перечислены в разделе «загружено через пространство имен (и не присоединено)» в sessionInfo ().Эти пакеты установлены, но не загружены (т. Е. Нет библиотеки (некоторый импортированный пакет)).

Другая роль пространства имен заключается в том, чтобы сделать функции доступными для вашего пакета "внутри".Под этим я подразумеваю, что если ваш пакет использует функцию в импортированном пакете, он будет найден.

Однако, когда у вас есть пример в файле .Rd для запуска во время проверки, пакеты, которые вы использовалииметь под Зависит: в R 2.13, но в настоящее время в импорте: под R 2.14 не доступны.Это связано с тем, что среда проверки во многом похожа на поиск сценария в чистой среде (при условии, что вы используете R --vanilla, так что .Rprofiles и т. Д. Не запускались).Если в вашем примере вы не добавите оператор библиотеки (необходимого пакета), он не будет работать под R 2.14, даже если он работал под R 2.13.Таким образом, старые примеры не обязательно запускаются, даже если ваш пакет импортирует: необходимые пакеты, потому что опять-таки Imports: не совсем то же самое, что Depends: (строго, они присоединены, но не загружены).

Пожалуйста, исправьтемне, если что-то из этого не так.Большое спасибо Хэдли Уикхем и другим, кто помог мне в этом!

1 голос
/ 22 октября 2013

Я недавно работал над этим для одного из моих пакетов. Вот мои новые строки Зависит, Импортирует и Предлагает

Depends: R (>= 2.15.0)
Imports: nlme, mvtnorm, KFAS (>= 0.9.11), stats, utils, graphics
Suggests: Hmisc, maps, xtable, stringr

статистика, утилиты и графика являются частью базы R, но пользователь может отсоединить их, и тогда мой пакет не будет работать. Если вы используете R из командной строки, вы можете подумать: «Зачем кому-то их отключать?». Но если пользователь использует RStudio, скажем, я мог бы видеть, как он проходит и «снимает галку» со всех пакетов. Странная вещь, тем не менее, я не хочу, чтобы мой пакет перестал работать, если они это сделают. Или они могли бы переопределить, скажем, функцию plot (или какую-то другую функцию), и тогда мой пакет потерпит неудачу.

У моего NAMESPACE есть следующие строки

import(KFAS)
import(stats)
import(utils)
import(graphics)

Я не хочу анализировать статистику, утилиты и графические функции, которые я использую, поэтому я импортирую все их пространства имен. Для KFAS мне нужны только 2 функции, но имена экспортированных функций менялись между версиями, поэтому я импортирую все пространство имен, а затем в тесте кода проверяю, какая версия у пользователя.

Для mvtnorm и nlme я использую только одну функцию, поэтому я импортирую только те. Я мог бы импортировать все пространство имен, но попытаться импортировать только то, что я действительно использую.

importFrom(mvtnorm, rmvnorm)
importFrom(nlme, fdHess)

Виньетки, в которых появляются пакеты с предложениями, имеют

require(package)

строк в них.

Для экспортируемых функций в моем NAMESPACE я немного разорван. CRAN стал строгим в том, чтобы не допустить ::: в код вашего пакета. Это означает, что если я не экспортирую функцию, я ограничиваю творческое повторное использование. С другой стороны, я понимаю необходимость экспортировать только те функции, которые вы намерены поддерживать, со стабильным списком аргументов и выводить их, в противном случае мы нарушаем пакеты друг друга, изменяя интерфейс функции.

...