#r #package #cran
#r #пакет #cran
Вопрос:
У меня есть пересмотр пакета, в который я добавил некоторый код построения графика, который использует пакет ggplot2, а также настраиваемый масштаб из масштаба пакета. В частности, в новом коде есть одна строка, которая ссылается на пакет scales, вида:
trans = scales::trans_new("new scale", ...)
Я отправил пакет в Winbuilder, чтобы проверить его, и я получаю эту ошибку:
Error in loadNamespace(name) : there is no package called 'scales'
… и действительно, я получаю ту же ошибку, если запускаю R CMD check --as-cran
-
Да, scales установлен в моей системе.
-
Да, scales включен
Suggests
в мойDESCRIPTION
файл; Я дважды и трижды проверял это. -
Да, scales, похоже, является пакетом, все еще доступным в CRAN, с множеством и множеством обратных зависимостей.
У меня также есть десятки вызовов ggplot2::xxxx
подпрограмм в моем коде, и ggplot2 также Suggests
включен. Ошибок нет.
Что я могу делать неправильно?
Комментарии:
1. ggplot2 не находится в зависимости, и я использую
ggplot2::
кучу раз таким же образом. Я определенно не хочу дополнительных вещей в зависимости.2. Если у вас есть десятки вызовов к чему-то, то ваш пакет явно зависит от этого. Что произойдет с вашими пользователями, когда они попадут по этим ссылкам?
3. У меня есть
requireNamespace()
проверка, сопровождающая их. Я понял это. Смотрите мой ответ…4. @Elin Размышляя об этом дальше, я бы сказал, что не следует ничего добавлять в Depends, если только пользователю действительно не нужен этот пакет в пути поиска. Для пакетов, необходимых для достижения основных целей пакета, они должны быть импортированы. В этом случае пользователи моего пакета могут никогда не использовать какие-либо из его возможностей построения графиков, поэтому я помещаю ggplot2 в Предложения и выполняю проверку пространства имен. Я думаю, что чрезмерные зависимости — это реальная проблема с R-пакетами. У многих есть сотни зависимостей, и это все, что нужно загрузить в память.
Ответ №1:
Я понял это; это было немного сложно (по крайней мере, для кого-то вроде меня).
В других местах моего пакета, где я вызываю функции из пакета Suggests
, у меня также есть строка кода, которая выглядит следующим образом:
if (!requireNamespace("ggplot2", quietly = TRUE))
stop ("The 'ggplot2' package is not installed installed.", call. = FALSE)
... code that calls ggplot2:: functions
Проблема здесь заключалась в том, что (а) у меня не было такой проверки scales
; но что более важно, (б) приведенное выше назначение trans = scales::...
было в пространстве имен моего пакета.
Итак, что я сделал, так это переместил назначение trans
во внутреннюю часть функции, где оно используется, и предшествовал ему requireNamespace()
тестом, аналогичным приведенному выше. Теперь моя проверка пакета, по крайней мере, проходит эту точку --as-cran
проверки.