Включить пакет не-CRAN в пакет CRAN

Вопрос довольно простой. Первый:

  1. Можно ли включить не-CRAN-пакет (или биопроводник, или омега-шляпу) в CRAN-пакет и фактически использовать инструменты из этого пакета в примерах.
  2. Если да, то как настроить файл DESCRIPTION и т. д., чтобы сделать его законным и пройти проверки CRAN?

В частности, я спрашиваю о openNLPmodels.en, который раньше был пакетом CRAN. Это довольно полезно, и я хочу включить в него функциональность. Я мог бы обойти это, а не использовать openNLPmodels.en в примерах или создать для него модульные тесты и установить его при использовании функции (аналогично тому, как gender strong> пакет устанавливает необходимые ему наборы данных), но я бы предпочел подход, который позволяет мне запускать проверки, тексты, примеры.

Вот как можно загрузить и установить openNLPmodels.ru

install.packages(
    "http://datacube.wu.ac.at/src/contrib/openNLPmodels.en_1.5-1.tar.gz",  
    repos=NULL, 
    type="source"
)

person Tyler Rinker    schedule 25.10.2015    source источник
comment
Я не уверен, относится ли это к теме переполнения стека ... может быть лучше для списка r-packages-devel (не уверен, как именно он называется) ...?   -  person Ben Bolker    schedule 26.10.2015
comment
Пакеты, от которых зависит пакет CRAN, должны быть доступны в основном репозитории: если какие-либо из них, упомянутые в полях «Предлагает» или «Улучшает», не из такого репозитория, где их можно получить в репозитории, следует указать в « Дополнительные_репозитории» файла DESCRIPTION (в виде списка URL-адресов репозиториев, разделенных запятыми) или для других средств доступа, описанных в поле «Описание». cran.rstudio.org/web/packages/policies.html   -  person hrbrmstr    schedule 26.10.2015
comment
Это звучит как плохая идея. Почему бы вам не скопировать нужный вам функционал? Это с открытым исходным кодом? Или поговорите с автором openNLPmodels.en и узнайте, сможете ли вы принять или разветвить его?   -  person Jeroen    schedule 26.10.2015


Ответы (2)


Существующий ответ хорош, но не объясняет весь процесс в деталях, поэтому публикует этот.


Можно ли включить не-CRAN-пакет (или биопроводник, или омега-шляпу) в CRAN-пакет и фактически использовать инструменты из этого пакета в примерах.

Да, это возможно. Любое использование (код пакета, примеры, тесты, виньетки) такого не-CRAN должно быть экранировано, как и любой другой пакет в Suggests, в идеале с использованием

if (requireNamespace("non.cran.pkg", quietly=TRUE)) {
  non.cran.pkg::fun()
} else {
  cat("skipping functionality due to missing Suggested dependency")
}

Если да, то как настроить файл DESCRIPTION и т. д., чтобы сделать его законным и пройти проверки CRAN?

Вам нужно использовать поле Additional_repositories в файле DESCRIPTION. Расположение, указанное в этом поле, должно содержать ожидаемую структуру каталогов, файл PACKAGES в соответствующем каталоге, а файл PACKAGES должен иметь указанный пакет, отличный от CRAN.


Теперь перейдем к вашему конкретному примеру пакета openNLPmodels.en. В соответствии с способом загрузки и установки этого пакета его нельзя будет использовать в качестве зависимости и передать CRAN. openNLPmodels.en должен быть опубликован в структуре, ожидаемой от репозитория R. В противном случае у вас нет допустимого местоположения для ввода в поле Additional_repositories.

Что вы можете сделать, так это загрузить пакет, отличный от CRAN, и опубликовать его в своем репозитории R самостоятельно, а затем использовать это местоположение в поле Additional_repositories в вашем пакете CRAN. Вот пример того, как это сделать:

dir.create("src/contrib", recursive=TRUE)
download.file("http://datacube.wu.ac.at/src/contrib/openNLPmodels.en_1.5-1.tar.gz", "src/contrib/openNLPmodels.en_1.5-1.tar.gz")
tools::write_PACKAGES("src/contrib")

Мы просто помещаем исходники пакета в ожидаемый каталог src/contrib, а все остальное прекрасно обрабатывается функцией write_PACKAGES. Чтобы убедиться, что репозиторий создан правильно, вы можете перечислить пакеты, доступные в этом репозитории:

available.packages(repos=file.path("file:/",getwd()))

Там должен быть указан ваш пакет, отличный от CRAN. Затем, опубликовав пакет, отличный от CRAN, в репозитории R, вы должны разместить репозиторий в поле Additional_repositories вашего пакета CRAN. В этом случае местоположение будет возвращено выражением file.path("file:/",getwd()).

Обратите внимание, что он использует местоположение на вашем локальном компьютере, вы, вероятно, захотите разместить его в сети, чтобы к URL-адресу мог получить доступ любой компьютер, проверяющий ваш пакет CRAN, включая проверки самого CRAN. Для этого просто переместите каталог src в каталог public, который будет размещен где-то в сети, и используйте местоположение этого сервера.


Теперь снова взглянув на ваш не-CRAN-пакет, мы увидим, что в его URL-адресе есть src/contrib, поэтому мы можем предположить, что для него уже существует подходящий репозиторий R, и нам не нужно создавать и опубликовать новый. Поэтому ваша инструкция по установке может выглядеть так

install.packages(
  "openNLPmodels.en", 
  repos="http://datacube.wu.ac.at",
  type="source"
)

И тогда все, что вам нужно для вашего пакета CRAN, — это использовать существующий репозиторий, где он доступен.

Additional_repositories http://datacube.wu.ac.at
person jangorecki    schedule 20.11.2020

Возможно, но! ...

В файле DESCRIPTION есть поле, которое вы можете использовать:

Additional_repositories: http://ghrr.github.io/drat

НО!

Все, что зависит от функциональности от пакета из дополнительного репозитория, должно быть абсолютно необязательным.

Таким образом, пакеты из этого репозитория должны быть помещены под Suggests.

Пример

Я не уверен на 100%, считаются ли BioConductor и OmegaHat мейнстримом или нет.

person petermeissner    schedule 21.06.2019