#r #package
#r #пакет
Вопрос:
Я пытаюсь разобраться с тем, что кажется конфликтом между именами функций, когда я проверяю пакет. В конце концов, я могу прямо спросить о проблеме, но сначала меня интересуют три вещи, ни одна из которых, похоже, не упоминается в R-exts:
- Пакеты, перечисленные в DESCRIPTION: Imports и NAMESPACE imports(), должны быть одинаковыми, верно?
- Имеет ли значение порядок импорта в любом списке? Если да, есть ли какие-либо общие рекомендации о том, как их заказать?
- Я использую R —vanilla CMD для проверки pkg_name, чтобы избежать вмешательства моего .Rprofile. Когда my .Rprofile активен и содержит инструкции library (pkg_name), имеет ли значение их порядок?
Ответ №1:
Вы задали три вопроса.
1. Перечислите пакеты в DESCRIPTION
, а также NAMESPACE
Каждый пакет, указанный в DESCRIPTION
Imports:
, должен иметь соответствующую запись NAMESPACE
import(...)
. Запись в DESCRIPTION
может содержать информацию о версии, но в NAMESPACE
вы только называете пакет.
Примечание для неосторожных: в ОПИСАНИИ пишется Imports
с заглавной I
буквы и заканчивается s
Например:
Описание
Imports:
stringr (>= 0.5)
ПРОСТРАНСТВО ИМЕН
import(stringr)
2. Порядок имеет значение
Пакеты, которые вы load
или import
более поздние, маскируют пакеты, которые были загружены или импортированы ранее. Это имеет значение только в том случае, если вы импортируете пакеты, которые экспортируют функцию с идентичным именем.
Например, оба lattice
и ggplot2
экспортируют layer
функцию. Таким образом, если вы сначала импортируете lattice
, а затем ggplot2
, это означает, что ggplot2::layer
будет маскироваться lattice::layer
.
Другими словами, использование layer
будет относиться к ggplot2::layer
. Если вы хотите сослаться на lattice
версию, на которую вам нужно явно ссылаться lattice::layer
в вашей функции.
3. Порядок загрузки пакетов также имеет значение
По той же причине порядок загрузки пакетов (либо в скрипт, либо в .Rprofile) имеет значение. Любой загружаемый вами новый пакет будет маскировать функции с тем же именем в ранее загруженных пакетах.
Когда это происходит, R делает разумную вещь и сообщает вам об этом в сообщении консоли.
Вот пример маскирования, возникающего при загрузке reshape
пакета, который зависит от plyr
, но также маскирует некоторые функции в plyr
:
library(reshape)
Loading required package: plyr
Attaching package: 'plyr'
The following object(s) are masked from 'package:braidppt':
.
Attaching package: 'reshape'
The following object(s) are masked from 'package:plyr':
rename, round_any
Комментарии:
1. Спасибо, Андри … ваш ответ был очень ясным и подтвердил то, что я думал, что происходит. Теперь я должен выяснить, в каком порядке все должно быть. Возможно, это слишком очевидно, но примечание об этом в R-exts, вероятно, было бы полезно.
2. Оглядевшись немного больше, я вижу, что > конфликты (detail = TRUE) могут помочь мне найти проблему.
3. Обратите внимание, что если у вас есть конфликты, вам, вероятно, следует использовать
importsFrom
, чтобы просто импортировать выбранные функции из каждого пакета