如何指定在使用roxygen2其中为了加载S4方法(How to specify in which

2019-08-03 02:14发布

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

假设你有两个类, 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 。 因此,对于参考,这里是我的发现。

Answer 1:

有两种方法来实现:

正如描述的?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文件,并加载任何文件都在他们指定的顺序第一个指定的存在。 只有这样,包装的其余部分被加载。



文章来源: How to specify in which order to load S4 methods when using roxygen2