2012-11-22 31 views
10

kullanılırken S4 yöntemlerini hangi sırada yükleyeceğimi nasıl belirledim Birden çok kez aşağıdaki soruna girdim.Roxygen2

#' 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")) 

Ve 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")) 

ben bu dosyaları roxygen2 göre alfabetik olarak okunmuştur inanıyordu, ama bu:

iki sınıfları, classA ve classB aşağıdaki dosyaları classA.R tarif var ki durum böyle değil.

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

nasıl roxygenize() hangi sırayla dosyaları okumak için bilir emin olabiliriz, sınıf tanımı diğer önce okunması gereken diğer bir deyişle: Ben paketi oluşturmak çalışırsanız, aşağıdaki hatayı alabilirsiniz?


Not: Kendi sorumu yanıtladığımı biliyorum. Bunun nedeni, sık sık bu soruna rastladım ve roxygen2 koduna baktıktan sonra bunu yapmak için doğru yolu fark ettim. Referans olarak, işte benim bulgularım.

?collate_roclet açıklandığı üzere

, hangi önce okunması gereken hangi sınıf belirtmek için @include etiketi kullanabilirsiniz:

cevap

10

bunu başarmak için iki yol vardır. Bu durumda, dosya classB.r sağ fiili R kodundan önce aşağıdaki satırı ekleyebilirsiniz: Bu etiketler DESCRIPTION dosyada Collate alanı güncelleştirmek için özel olarak okunmaktadır

#' @include classA.r 

ve başa tavsiye yoludur sorun ile.

Bazı durumlarda bağımlılıklar, bir genel bakış açısını kendiniz saklamak isteyeceğiniz kadar karmaşık olabilir ve kod tabanınızda @include etiketlerinin eklenmesine tamamen güvenmeyin. Bu durumda sadece bu gibi DESCRIPTION dosyanın sonuna Collate alanını belirtebilirsiniz:

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

dosyalar' için ilk orada belirtilen ne olursa olsun fonksiyonu roxygenize() ilk kontroller DESCRIPTION dosyası ve yükler yeniden belirtildi. Sadece o zaman paketin geri kalanı yüklenir.

+0

'@ include' etiketini kaçırdınız sanırım ... – hadley

+0

@hadley Soruma yazdığım gibi, '@ include' etiketini denedim ve aynı zamanda farklı sınıflardaki yardım dosyalarını birleştirdim. Benim niyetim değil). Collate alanını kullanarak gayet iyi çalışıyor, ama umarım bir sonraki rox versiyonunda bunun için zarif bir çözüm üretmek için biraz zaman ve ilham bulabilirsiniz. –

+0

'@ include' harmanlamadan başka bir şey değiştirmemelidir. Minimal bir tekrarlanabilir örnek verebilir misiniz? – hadley