10

我已经多次遇到以下问题。

假设您有两个类,classAclassB在以下文件中进行了描述classA.R

#' the class classA
#'
#' This is a class A blabla
#' \section{Slots}{\describe{\item{\code{A}}{a Character}}}
#' @ name classA
#' @rdname classA
#' @exportClass classA
setClass("classA",representation(A="character"))

classB.R

#' the class classB
#'
#' This is a class B blabla
#' \section{Slots}{\describe{\item{\code{B}}{an object of class A}}}
#' @ name classB
#' @rdname classB
#' @exportClass classB
setClass("classB",representation(B="classA"))

我相信这些文件是按字母顺序阅读的roxygen2,但事实并非如此。如果我尝试构建包,我可能会收到以下错误:

roxygenize("./myExample")
Error in getClass(Class, where = topenv(parent.frame())) :
   "ClassA" is not a defined class

我如何确保roxygenize()知道读取文件的顺序,即应该先读取哪个类定义?


注意:我知道我回答了我自己的问题。那是因为我经常遇到这个问题,并且在查看roxygen2. 因此,作为参考,这是我的发现。

4

1 回答 1

10

有两种方法可以实现这一点:

如 中所述?collate_roclet,您可以使用 @include 标记指定应该在哪个类之前读取哪个类。在这种情况下,您可以在文件中添加classB.r实际 R 代码之前的以下行:

#' @include classA.r

专门读取这些标签以更新文件Collate中的字段DESCRIPTION,并且是处理问题的推荐方法。

在某些情况下,依赖关系可能非常复杂,您希望自己保持概览,而不是完全依赖@include在代码库中添加标签。在这种情况下,您只需指定文件Collate末尾的字段DESCRIPTION,如下所示:

Package: myExample
Type: Package
...
Collate:
    'classA.R'
    'classB.R'

该函数roxygenize()首先检查DESCRIPTION文件,然后按照指定的顺序首先加载那里指定的任何文件。然后才加载包的其余部分。

于 2012-11-22T10:07:17.080 回答