Когда я пишу свой собственный R-пакет, я не могу заставить другие пакеты правильно импортировать

Хорошо, первая попытка написать пакет R, и я застрял. Вот как я создаю пакет:

package.skeleton("pkg",code_files=some.filenames)
roxygenize("okg")

Я использую roxygen2 и у меня есть следующий импорт в моем файле "pkg-package.R":

@import data.table zoo lubridate

Из терминала я запускаю:

R CMD build pkg
R CMD check pkg
R CMD install pkg

На этапе проверки я получаю следующие предупреждения:

** подготовка пакета для ленивой загрузки
Предупреждение: замена предыдущего импорта 'час' при загрузке 'lubridate'
Предупреждение: замена предыдущего импорта 'mday' при загрузке 'lubridate'
Предупреждение: замена предыдущего импорта "месяц" при загрузке "lubridate"
Предупреждение: замена предыдущего импорта 'wday' при загрузке 'lubridate'
Предупреждение: замена предыдущего импорта "неделя" при загрузке "lubridate"
Предупреждение: замена предыдущего импорта 'yday' при загрузке 'lubridate'
Предупреждение: замена предыдущего импорта 'year' при загрузке 'lubridate'
** Помогите
* установка справочных индексов
** построение индексов упаковки...
** тестирование, если установленный пакет может быть загружен
Предупреждающие сообщения:
1: замена предыдущего импорта 'час' при загрузке 'lubridate'
2: замена предыдущего импорта 'mday' при загрузке 'lubridate'
3: замена предыдущего импорта 'month' при загрузке 'lubridate'
4: замена предыдущего импорта 'wday' при загрузке 'lubridate'
5: замена предыдущего импорта "неделя" при загрузке "lubridate"
6: замена предыдущего импорта 'yday' при загрузке 'lubridate'
7: замена предыдущего импорта 'year' при загрузке 'lubridate'

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

библиотека (PKG)
Переопределение + и - методов для POSIXt, Date и difftime
Предупреждающие сообщения:
1: замена предыдущего импорта 'час' при загрузке 'lubridate'
2: замена предыдущего импорта 'mday' при загрузке 'lubridate'
3: замена предыдущего импорта 'month' при загрузке 'lubridate'
4: замена предыдущего импорта 'wday' при загрузке 'lubridate'
5: замена предыдущего импорта "неделя" при загрузке "lubridate"
6: замена предыдущего импорта 'yday' при загрузке 'lubridate'
7: замена предыдущего импорта 'year' при загрузке 'lubridate'
d <- my.function (arg1, arg2)
Ошибка в MATCH(x, x): не удалось найти функцию "MATCH"

Используя traceback(), я обнаружил, что это генерируется во время вызова merge.zoo(). Поэтому я попытался загрузить зоопарк вручную во время сеанса R и вуаля, затем функция работает правильно без сообщения об ошибке.

Я попытался изменить порядок импорта вручную как в файле "pkg-package.R", так и в NAMESPACE. Однако, основываясь на том, что я нашел в другом месте, я не добавил ни одного импорта или зависимости к описанию. Помогите?

2 ответа

Предупреждения, потому что data.table и lubridate оба определяют символ hour, так далее; увидеть data.table::hour а также lubridate::hour, Вы можете избежать этого, импортируя только нужные вам функции из lubridate / data.table, а не весь пакет; стандартный файл NAMESPACE будет содержать

importFrom(lubridate, hour)

например. В roxygen2 вы бы использовали тег:

@importFrom lubridate hour

Проблема МАТЧА, вероятно, потому что merge отправляет неправильно, вероятно, потому что зоопарк должен иметь в своем пространстве имен S3method(merge, zoo) скорее, чем export(merge.zoo), как описано в Writing R Extensions, 1.6.2. Решение здесь заключается в том, чтобы связаться с сопровождающим zoo, packageDescription('zoo')$Maintainer (Сопровождающий достаточно разбирается в R, и мне кажется, что я поставил неправильный диагноз...).

В качестве временного обхода ошибки MATCH я успешно перечислил zoo пакет под Depends: раздел пакета DESCRIPTION файл.

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