【问题标题】:Roxygen and suggested packagesRoxygen 和建议的软件包
【发布时间】:2013-10-27 02:33:16
【问题描述】:

我正在使用roxygen2 开发一个包,其中包括许多基于lattice 的可视化。这些很好,但对于使用包来说不是必需的,因此lattice 列在DESCRIPTION 文件的Suggests: 部分而不是Depends: 部分。

但是,我还没有弄清楚如何根据用户的请求以同时传递roxygenize() 和R CMD check 的方式加载lattice。以下两种方式都使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”一词与“suggests”、“depends”和“imports”的搜索返回了大量不相关的点击,我一直在寻找这个问题的答案,但没有成功。同时,我刚刚将lattice 和一些其他不错但非重要的包列为依赖项,但现在当我即将发布包时,我想以正确的方式解决它。

【问题讨论】:

  • 您是否尝试在您的函数 roxygen 部分添加 #' @importFrom lattice xyplot ?
  • 我现在做了,但它给了我同样的错误。
  • 但是 roxygen 是否在 DESCRIPTION 的 Imports 部分中添加了晶格?
  • 在包的 roxygenization 中,lattice 保留在 DESCRIPTION 文件的 Suggests 部分中,但在 NAMESPACE 文件中列为 import(lattice)。所以问题出在roxygenize() 而不是R CMD check 我得出结论。
  • 尝试手动将晶格从Suggests 移动到Imports,也许?

标签: r roxygen2


【解决方案1】:

在条件语句中使用的建议(在 2013 年我第一次写这个答案时)是 require。现在在 2016 年 the official recommendation 是使用 :: 并让 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)
}

并且只在您的DESCRIPTION 中保留Suggests: lattice(在NAMESPACE 中没有import)。

如果您想自定义错误消息,您现在可以在条件语句中使用requireNamespace(lattice),例如:

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

【讨论】:

  • 除了作为常规方式之外,您知道是否有任何特殊原因使用if(require(pkg)) stop(msg) 而不是library(pkg) 会自动抛出您手动指定的错误?
  • 我不认为有任何原因,因为这两个函数显然做了完全相同的事情。
  • 那么我可能会坚持我自己的答案,因为我和@while 已经讨论过这个问题。但感谢您为了完整起见添加它!
  • 请注意,建议已更改,现在要求使用 :: 代替。见cran.r-project.org/doc/manuals/r-release/…。我会更新我的答案
【解决方案2】:

我不确定是什么导致了我的问题,但在@juba 的帮助下进行了一些调试后,事实证明我已经在问题中提出了正确的解决方案。处理 nice-but-not-vital 包的正确方法是将它们列在 DESCRIPTION 文件的 Suggests: 部分中,并使用 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,则会抛出错误。

【讨论】:

  • 根据文档,您应该在函数中使用require 而不是library,因为如果缺少包,它将发出警告而不是抛出错误。
  • 我也看到了。但是,在我的情况下,如果包丢失,我 想 抛出错误。如果没有,无论如何都会在下一行抛出一个关于找不到xyplot 函数的错误,这对最终用户来说可能更加模棱两可。
  • 好的,抱歉。在这种情况下,您可能应该使用library。只是想分享一下,以防您错过它,因为如果您也使用 require ,库应该会自动加载。如果您使用require,您还可以更灵活地处理结果,因为它会返回一个布尔值。
  • 是的,你说得对。最好的解决方案甚至可能是测试是否可以使用require 加载包,如果找不到,请询问用户是否应该自动安装。
  • 讨论晚了,但更值得深思的是:编写了许多(大多数?)函数以最大程度地减少副作用,但任何调用 library 或 require 的包代码更改 R 会话其余部分的搜索路径,即使在函数退出后也是如此。这通常不是一个大问题,但随着命名空间冲突的增加(例如,stats 和 dplyr 中的 filter()),它确实会产生影响。我发现通常最好使用已经提到的::,或者如果需要返回,则使用requireNamespace,然后调用::-函数。搜索路径未更改。
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 2011-12-24
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多