2012-11-22 6 views
10

다음과 같은 문제가 여러 번 발생했습니다.roxygen2를 사용할 때 S4 방법을로드하는 순서를 지정하는 방법

#' 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의 알파벳 순서로 읽은 믿고 있지만 :

는 두 개의 클래스, classAclassB 다음 파일 classA.R에 설명을 말해봐 그렇지 않다.

roxygenize("./myExample") 
Error in getClass(Class, where = topenv(parent.frame())) : 
    "ClassA" is not a defined class 

가 어떻게 roxygenize() 어떤 순서로 파일을 읽을 알고 있는지 확인 할 수 있습니다, 클래스 정의는 다른 전에 읽어야 즉 : 나는 패키지를 빌드하려고하면, 나는 다음과 같은 오류가 발생할 수 있습니다?


참고 : 나는 내 자신의 질문에 대답했습니다. 그 이유는이 문제가 자주 발생하여 roxygen2 코드를 살펴본 후이를 수행 할 수있는 적절한 방법을 깨닫게 되었기 때문입니다. 참고로 여기 내 연구 결과가 있습니다.

?collate_roclet에서 설명한 바와 같이

, 당신은 어떤 전에 반드시 숙지해야하는 클래스 지정 @include 태그를 사용할 수 있습니다 :

답변

10

는이를 달성하는 방법은 두 가지가 있습니다. 이 경우 파일 classB.r 바로 실제 R 코드 전에 다음 줄에 추가 할 수 있습니다 태그가 DESCRIPTION 파일의 Collate 필드를 업데이트하기 위해 특별히 읽어

#' @include classA.r 

및 처리의 권장 방법 문제가있다.

경우에 따라 의존성이 너무 복잡하여 개요를 유지하면서 코드베이스에 @include 태그를 추가하는 데 전적으로 의존하지 않을 수도 있습니다. 이 경우 당신은이처럼 DESCRIPTION 파일의 끝 부분에 Collate 필드를 지정할 수 있습니다

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

파일들이 '순서에서 첫 번째가 지정되어 어떤 기능 roxygenize() 첫 번째 체크 DESCRIPTION 파일 및로드 다시 지정되었습니다. 그런 다음 나머지 패키지가로드됩니다.

+0

당신이'@ include' 태그를 놓친 것 같아요. – hadley

+0

@hadley 제 질문에 쓴 것처럼'@ include' 태그를 시도했고 다른 클래스의 도움말 파일을 병합했습니다. 내 의도가 아님). Collate 필드를 사용하여 잘 작동하지만, 다음 번 roxygen 버전에서이를위한 우아한 솔루션을 통합 할 시간과 영감을 얻길 바랍니다. –

+0

'@ include'는 한 부씩 인쇄에서 다른 것을 변경해서는 안됩니다. 최소한의 재생산 가능한 예제를 제공 할 수 있습니까? – hadley