我已经多次遇到以下问题。
假设您在以下文件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
的代码后才意识到执行此问题的正确方法。因此,作为引用,这是我的发现。
最佳答案
有两种方法可以实现此目的:
如?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
文件,并首先按照指定的顺序加载在那里指定的所有文件。只有这样,程序包的其余部分才会加载。
关于r - 使用roxygen2时如何指定以哪种顺序加载S4方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13510234/