2012-03-01 4 views
27

내가 개발중인 R 패키지에는 미리 계산 된 모델 및 매개 변수와 같은 여러 개의 R 데이터 객체가 필요합니다.패키지 내부의 R 데이터를 어떻게 처리합니까?

현재 각 패키지는 개별 .RData 파일의 'data'디렉토리에 있습니다. 패키지를 사용할 때 "데이터"기능을 사용하여 이러한 객체를 환경에 연결할 수 있습니다.

대신에 내가 바라는 동작은 패키지를로드 할 때 데이터 객체가 자동으로 내부 패키지 환경에 연결되어 사용자가 직접 액세스 할 수 없기 때문입니다.

내 이해는 현재 '데이터'에있는 개체가 들어있는 패키지의 'R'디렉토리에 'sysdata.rda'파일을두면 원하는 결과를 얻을 수 있습니다. 그러나 각 개체를 그룹화하지 않고 별도의 파일로 가질 수 있도록이 작업을 수행 할 수있는 방법이 있습니까?

+0

왜 각 개체를 별도의 파일에 넣을 까? 왜 각 개체를 개별적으로 참조하지 않습니까? 예 :'packagename ::: a'와'packagename ::: b'. –

+0

@the_skua 별도의 파일은 패키지의 파일 버전 관리가 쉬워졌습니다. 이것은 얼마 전 이었지만 패키지의 일부로 다른 모델을 사용한다고 생각합니다. 때로는이 중 하나만 업데이트하려고하지만 전체가 업데이트되지는 않을 것입니다. – Nixuz

답변

9

패키지를로드 할 때 후크를 사용하여 data()을 호출하고 데이터 객체를로드 할 환경으로 패키지 네임 스페이스를 지정할 수 있습니다.

당신이 당신의 패키지에 어딘가에 기능

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

을 정의 파일을 foopkg라는 패키지의 data/ 디렉토리에 model1.Rmydata.RData을 가정하면 (예를 들어, foopkg-package.R에서). 패키지를 구축하고 설치 한 후

,

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

다양한 데이터 객체가 성공적으로 즉 패키지의 기능을 볼 수 있지만, 지구 환경을 오염하지, 패키지 네임 스페이스에로드 된 것을 증명해야한다.

12

sysdata.rda 파일을 패키지의 data 디렉토리에 넣으십시오.

게으른 데이터를 사용하지 마십시오 - 당신의 설명 파일이, 실행하는 경우, 그것은 당신의 패키지의 R 디렉토리에있는 .R 파일에서 LazyData: no

을해야한다, LazyData에 대한 행이 있거나 안 중 이

data(sysdata, envir=environment()) 

같은 줄을 추가 나는 data.framesysdata라는 이름의 생성이라는 패키지의 데이터 디렉토리에 sysdata.rda라는 파일에 저장 anRpackage

위의 줄을 .R 파일에 추가하고이 unexported 함수 을 추가하여 패키지의 함수가 데이터에 액세스 할 수 있음을 보여줍니다.

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

는 다음 나는

> 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 

그래서, 사용자는 여전히 데이터에 액세스 할 수는 R 세션은 다음을 참조하지만, 당신이 요청에 따라, 그들은 직접에 액세스 할 수 없습니다. 사용자는 여전히 data(sysdata)을 실행할 수 있습니다.

+3

이 응답은 질문에 대답하지 않습니다. 데이터 액세스 가능성 범위가 아닌 다른 파일로 데이터를 나누는 것에 대해 묻습니다. – Nixuz

+1

현재 데이터 디렉토리에 많은 데이터 파일이 있다고합니다. 따라서 각 데이터 파일에 대해'data (sysdata, envir = environment()) '와 같은 라인을 추가하면 "자동으로 내부 패키지 환경에 연결되어 사용자가 직접 액세스 할 수 없습니다". 당신이 원하는 것을 분명히하십시오. – GSee

관련 문제