Когда я пишу свой собственный 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
файл.