2012-03-01 19 views
27

Geliştirmekte olduğum R paketi, önceden hesaplanmış modeller ve parametreler gibi birkaç R veri nesnesi gerektirir.R Data'ın bir pakete nasıl dahil edilir?

Şu anda, her bir nesnenin, paketin 'data' dizininde bireysel .RData dosyalarında var. Paketi kullanırken, kullanıcılar bu nesneleri çevrelerine eklemek için "veri" fonksiyonunu kullanabilirler.

İstediğim davranış, paketin yüklenmesi sırasında veri nesnelerinin otomatik olarak iç paket ortamına eklenmesi ve doğrudan kullanıcının erişemeyeceği davranış olabilir.

Anlayışım şu ki, 'data' içindeki nesneleri içeren paketin 'R' dizinine bir 'sysdata.rda' dosyası yerleştirmek bana istenen sonucu verecektir. Bununla birlikte, bunu yapmak için bir yol var mı, böylece her nesneyi ayrı bir dosyada bir araya getirmekteyim.

+0

Her bir nesneyi neden ayrı bir dosyaya koyunuz, neden her bir nesneyi ayrı ayrı göstermiyorsunuz? E.g., 'packagename ::: a' ve' packagename ::: b'. –

+0

@the_skua Ayrı dosyalar, paketteki daha kolay dosya sürümü yönetimi için kullanışlıdır. Bu bir süre önceydi, ama sanırım paketin bir parçası olarak farklı model uyumları vardı ve bazen bunlardan birini güncellemek isterdik ama hepsini değil. – Nixuz

cevap

9

Paketiniz yüklenirken data() numaralı telefonu aramak için .onLoad() kancasını kullanabilir ve paket ad alanını veri nesnelerini nereye yükleyeceğiniz ortam olarak belirleyebilirsiniz.

Eğer pakette yere işlevini

.onLoad <- function(libname, pkgname) { 
    data("model1", "mydata", package=pkgname, envir=parent.env(environment())) 
} 

tanımlamak, dosyaları foopkg adı verilen paketin data/ dizinde model1.R ve mydata.RData var varsayarsak (örneğin foopkg-package.R olarak). Paketi oluşturmak ve kurduktan sonra

,

> library(foopkg) 
> ls(loadNamespace("foopkg")) 

çeşitli veri nesneleri başarıyla yani paketinize fonksiyonlara görünür ama küresel çevreyi kirletmeden değil, paket ad yüklendikleri göstermelidir.

12

Paketinizin data dizininize sysdata.rda dosyanızı koyun.

Tembel Verilerini kullanmayın - senin AÇIKLAMA dosya eğer olursa, bu paketin R dizindeki herhangi .R dosyasında LazyData: no

olmalıdır LazyData için bir çizgi varsa, ya olmamalı ya Bu

data(sysdata, envir=environment()) 

gibi bir satır eklemek Ben data.framesysdata adında oluşturulan ve adı verilen bir paketin veri dizininde sysdata.rda adlı bir dosyaya kaydedilir anRpackage

Yukarıdaki satırı bir .R dosyasına ekledim ve paketin içindeki işlevlerin verilere erişebildiğini göstermek için numaralı bu bildirilmemiş işlevi ekledim.

foo <- function() tail(sysdata, 2) 

Sonra

> library(anRpackage) 
> sysdata 
Error: object 'sysdata' not found 

> anRpackage:::sysdata 
    A B C 
1 1 6 a 
2 2 7 b 
3 3 8 c 
4 4 9 d 
5 5 10 e 

> anRpackage:::foo() 
    A B C 
4 4 9 d 
5 5 10 e 

Yani, kullanıcılar verilere erişebilir bir R toplantı sonrasında görürsün, ama istendiği gibi, onlar direkt erişimi yoktur. Kullanıcı hala data(sysdata)'u çalıştırma seçeneğine sahiptir.

+3

Bu yanıt soruya cevap vermiyor. Verilerin veri erişilebilirlik kapsamını değil, farklı dosyalara bölünmesini istiyorum. – Nixuz

+1

Veri dizinde şu anda çok fazla veri dosyanız olduğunu söylüyorsunuz. Yani, bu veri dosyalarının her biri için "data (sysdata, envir = environment())' gibi bir satır ekleyin, böylece "iç paket ortamına otomatik olarak eklenir ve doğrudan kullanıcı tarafından erişilemez." Lütfen ne istediğine açıklık getir. – GSee

İlgili konular