Roxygen и предлагаемые пакеты

Я разрабатываю пакет с roxygen2, который включает в себя ряд визуализаций на основе lattice. Они хороши, но не нужны для использования пакета, поэтому lattice указан в разделе Suggests: файла DESCRIPTION, а не в разделе Depends:.

Однако я еще не понял, как загрузить lattice по запросу пользователя таким образом, который передает как roxygenize(), так и R CMD check. Следующие два способа делают make lattice похожим на неустановленную зависимость и вернут ошибку ниже.

##' @import lattice
{}

##' Visualization
##'
##' @param x Data.
##' @param y More data.
##' @export
vizz <- function(x, y){
    xyplot(y ~ x)
}

и

##' Visualization
##'
##' @param x Data.
##' @param y More data.
##' @export
vizz <- function(x, y){
    library(lattice)
    xyplot(y ~ x)
}

обе дают ту же ошибку

$ R CMD check dummy.roxygen

* using log directory ‘/###/dummy.roxygen.Rcheck’
* using R version 3.0.2 (2013-09-25)
* using platform: x86_64-pc-linux-gnu (64-bit)
* using session charset: UTF-8
* checking for file ‘dummy.roxygen/DESCRIPTION’ ... OK
* checking extension type ... Package
* this is package ‘dummy’ version ‘1.0-0’
* package encoding: UTF-8
* checking package namespace information ... OK
* checking package dependencies ... ERROR
Namespace dependencies not required: ‘lattice’

See the information on DESCRIPTION files in the chapter ‘Creating R
packages’ of the ‘Writing R Extensions’ manual.

Поскольку поиски на терминах "roxygen" в сочетании с "подсказками", "зависит" и "импорт" возвращают поток нерелевантных обращений, я безуспешно искал ответ на это в течение довольно долгого времени. Тем временем я только что перечислил lattice и ряд других хороших, но не жизненно важных пакетов, а вместо этого, но теперь, когда я собираюсь опубликовать пакет, я бы хотел решить его надлежащим образом.

Ответ 1

Рекомендация, использованная (в 2013 году, когда я впервые написали этот ответ), должна быть require в условном выражении. Теперь в 2016 году официальная рекомендация должна использовать :: и позволить R распечатать ошибку there is no package called X:

##' Visualization
##'
##' @description Visualize the data. \pkg{\link{lattice}} package required.
##' @param x Data.
##' @param y More data.
##' @seealso \pkg{\link{lattice}}
##' @export
vizz <- function(x, y){
    lattice::xyplot(y ~ x)
}

И сохраняйте Suggests: lattice в DESCRIPTION (нет import в NAMESPACE).

Если вы хотите настроить сообщение об ошибке, вы можете использовать requireNamespace(lattice) в условном выражении, например:

vizz <- function(x, y){
    if (! requireNamespace("lattice", quietly = TRUE)) {
        stop("Please install lattice: install.packages('lattice')")
    lattice::xyplot(y ~ x)
}

Ответ 2

Я не уверен, что вызывало мои проблемы, но после некоторой отладки с помощью @juba оказалось, что я уже предложил правильное решение в вопросе. Правильный способ работы с пакетами nice-but-not-vital состоит в том, чтобы перечислить их в разделе Suggests: файла DESCRIPTION и пометить их следующим образом с помощью roxygen.

##' Visualization
##'
##' See \code{\link[lattice]{xyplot}} for details.
##'
##' @param x Data.
##' @param y More data.
##' @export
vizz <- function(x, y){
    library(lattice)
    xyplot(y ~ x)
}

Это не будет автоматически устанавливаться и не прикрепляться lattice при установке/прикреплении моего пакета, а просто выкидывать ошибку, если lattice не может быть присоединена при выполнении функции.