10

私はすでに何度も次の問題に遭遇しました。

2つのクラスが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。参考までに、これが私の調査結果です。

4

1 に答える 1

10

これを実現するには、次の2つの方法があります。

で説明されているように?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 に答える