我已多次遇到以下问题。
假设您在以下文件classA
中描述了两个类classB
和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
的代码后意识到了这样做的正确方法。所以作为参考,这是我的发现。
答案 0 :(得分:10)
有两种方法可以实现这一目标:
如?collate_roclet
中所述,您可以使用@include标记指定在此之前应该读取哪个类。在这种情况下,您可以在实际R代码之前的以下行添加文件classB.r
:
#' @include classA.r
这些标记专门用于更新Collate
文件中的DESCRIPTION
字段,是处理问题的推荐方法。
在某些情况下,依赖关系可能非常复杂,您希望自己保持概述,而不是完全依赖于在代码库中添加@include
标记。在这种情况下,您只需在Collate
文件的末尾指定DESCRIPTION
字段,如下所示:
Package: myExample
Type: Package
...
Collate:
'classA.R'
'classB.R'
函数roxygenize()
首先检查DESCRIPTION
文件,然后按照指定的顺序加载首先指定的文件。只有这样才能加载包的其余部分。