【问题标题】:How to specify in which order to load S4 methods when using roxygen2使用roxygen2时如何指定加载S4方法的顺序
【发布时间】:2012-11-22 10:07:17
【问题描述】:

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

假设您有两个类,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的代码后意识到了正确的方法。因此,作为参考,这是我的发现。

【问题讨论】:

    标签: r documentation package s4 roxygen2


    【解决方案1】:

    有两种方法可以实现:

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

    #' @include classA.r
    

    这些标签专门用于更新DESCRIPTION文件中的Collate字段,是处理问题的推荐方法。

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

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

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

    【讨论】:

    • @hadley 正如我在问题中所写,我尝试了@include 标签,并且该标签还合并了不同类的帮助文件(这不是我的意图)。使用 Collat​​e 字段可以正常工作,但我希望您能找到一些时间和灵感,在下一个版本的 roxygen 中加入一个优雅的解决方案。
    • @include 不应更改除整理之外的任何内容。你能提供一个最小的可重现的例子吗?
    • @hadley 我不能再复制了。我想这与我使用的命名有关(我可能使用了两次相同的名称)。我相应地更新
    猜你喜欢
    • 2011-11-13
    • 2014-08-06
    • 2013-09-03
    • 2013-09-24
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多