2012-01-17 3 views
29

devtools, testthat 및 roxygen2를 사용하여 R 패키지를 개발하고 있습니다. 데이터 폴더 (foo.txt 및 bar.csv)에 몇 가지 데이터 세트가 있습니다.test 또는 run_examples()에서 R 패키지 데이터를 사용할 수 있습니까?

내 파일 구조는 다음과 같습니다

#' Foo data 
    #' 
    #' Sample foo data 
    #' 
    #' @name foo 
    #' @docType data 
    NULL 
    #' Bar data 
    #' 
    #' Sample bar data 
    #' 
    #' @name bar 
    #' @docType data 
    NULL 

내가 '의 데이터를 사용하고 싶습니다 :

/ mypackage 
    /data 
     * foo.txt, bar.csv 
    /inst 
     /tests 
      * run-all.R, test_1.R 
    /man 
    /R 

내가'갑 '과'바 '제대로 설명되어 있습니다 확신 해요 foo '및'bar '를 사용하여 문서 예제 및 단위 테스트를 수행합니다. 나는 같이하는 문서의 예제를 싶습니다

data(foo) 
    data(bar) 
    expect_that(foo$col[1], equals(bar$col[1])) 

을 그리고 :

#' @examples 
    #' data(foo) 
    #' functionThatUsesFoo(foo) 

예를 들어, 나는 호출하여 내 testthat 테스트에서 이러한 데이터 세트를 사용하고 싶습니다

패키지를 개발하는 동안 데이터 (foo)를 호출하려고하면 "data set 'foo'not found"오류가 발생합니다. 그러나 패키지를 빌드하고 설치 한 다음로드하면 테스트 및 예제가 작동합니다.

foo <- read.delim(pathToFoo, sep="\t", fill = TRUE, comment.char="#") 
    bar <- read.delim(pathToBar, sep=";", fill = TRUE, comment.char="#" 
    expect_that(foo$col[1], equals(bar$col[1])) 

이 :

#' @examples 
    #' \dontrun{data(foo)} 
    #' \dontrun{functionThatUsesFoo(foo)} 

그리고 테스트에서

, 내 로컬 컴퓨터에 특정 경로를 사용하여 데이터를 미리로드 :

내 현재 작업 차선책은 예제를 실행하지 않을 수 있습니다 이상하게 보이지 않습니다. 특히 다른 사람들과 협력하고 있기 때문에 모든 공동 작업자에게 'foo'와 'bar'에 대한 동일한 전체 경로가 있어야합니다. 또한 패키지가 설치되면 문서를 실행할 수없는 것처럼 보입니다.

제안 사항? 감사합니다.

+1

data()를 사용하지 마십시오. 게으른 로딩에만 의존하십시오. – hadley

+0

마지막 코멘트에 대해 죄송합니다. 아직이 형식을 사용하고 있습니다. 고맙습니다 @ 할리. 그것은 테스트 테스트에 도움이되었습니다. 나는 데이터 세트를 활용할 수있는 문서 (roxygen2 사용)에서 예제를 만드는 방법에 관해서도 여전히 실망하고있다. – JPMac

+2

데이터를'.Rdata' 파일로 변환하면,'load_all'이 그것을로드합니다. – hadley

답변

17

는/내가 분명히으로 .rdata의 다양한 이외의 파일을 읽기의 몇 가지 예를 제공하는 데 필요한 the JSONIO package에서 어깨를 나란히하여이 문제에 대한 해결책을 발견

테스트합니다.

나는 기능 수준 예제에서 작동하고 R CMD check mypackagetestthat::test_package()을 모두 만족시킵니다.

(1) 예제 데이터 디렉토리가 inst 내에 있도록 패키지 구조를 재구성하십시오. 어떤 점에서 R CMD check mypackage은 non-RData 데이터 파일을 inst/extdata으로 옮기라고 했으므로이 새로운 구조에서 이름도 바뀌 었습니다. 새 testthat 테스트는 이제 R CMD check mypackage 동안 실행되도록

/ mypackage 
    /inst 
     /tests 
      * run-all.R, test_1.R 
     /extdata 
      * foo.txt, bar.csv 
    /man 
    /R 
    /tests 
     * run-testthat-mypackage.R 

(2) (선택 사항) 톱 레벨 tests 디렉토리를 추가합니다.

run-testthat-mypackage.R 스크립트는 최소한 다음 두 줄이 있어야합니다이 testthat이 R CMD check mypackage 중에 호출 할 수있는 부분이고, 그렇지 않으면 필요하지 않는 것이

library("testthat") 
test_package("mypackage") 

참고. DESCRIPTION 파일에 "Suggests :"의존성으로 testthat을 추가해야합니다.

(3) 마지막으로, 내 패키지 경로 지정하기위한 비밀 소스 :

barfile <- system.file("extdata", "bar.csv", package="mypackage") 
bar <- read.csv(barfile) 
# remainder of example/test code here... 

당신이 system.file() 명령의 출력을 보면, 그것은 내 패키지의 전체 시스템 경로를 반환을 R 프레임 워크. 맥 OS X에서이 같은 같습니다

"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/mypackage/extdata/bar.csv" 

이 나에게 좋아 보인다 이유 당신이 어떤 경로가 패키지 내의 이외의 기능을하지 하드 코드를 수행하는 것이, 그래서이 방법은 다른 강력한 상대해야한다 다른 시스템에 R 설치.

data() 방법은 data() 의미에 관해서는

, 지금까지의 내가이 말할 수있는 최상위 data 디렉토리에 R 바이너리 (.RData) 파일에 고유합니다. 따라서 데이터 파일을 미리 가져 와서 save() 명령을 사용하여 데이터 디렉토리에 저장하면 위의 예를 피할 수 있습니다. 그러나 이것은 파일을 가져 오는 업스트림 프로세스를 재현 가능하게 보여주는 것과 달리 데이터가 이미 R에로드 된 예제 만 보여 주면됩니다.

+0

심층 답변을 보내 주셔서 감사합니다. – JPMac

+0

반갑습니다. 도움이 된 것을 기쁘게 생각합니다. 내 자신의 패키지 개발에 유용 해 졌으므로 공유하고 싶었습니다. –

+0

나는 "상류의 수입 과정"을 재현 가능하게 만드는 방법을 찾아 내려고 노력해왔다. 내가 가지고있는 전형적인 유스 케이스는 사소한 것이 아닌 쉐이핑 파일의 변형으로 작업하고 싶다. 아마도 1 분 정도 걸릴 것이다. shapefile을'inst/extdata'에 포함시킬 수는 있지만'install()'안에서 실행되는 코드에서 그 경로를 찾지 못하는 것 같습니다. 게다가'document()'도'data /'안에있는 모든'.r' 파일을 다시 만들고 싶습니다. 함수에 대한 문서를 추가하거나 변경할 때마다 다시 작성하고 싶지 않습니다. 'data/Makefile'하지만 그게 멍청 해 보입니다. 팁 감사! – dholstius

2

@@ hadley의 의견에 따르면 .RData 변환이 잘 작동합니다.

팀 구성원 간의 다양한 환경과의 팀 공동 작업에 대한 더 광범위한 질문에 대해서는 공통된 패턴이 단일 환경 변수 (예 : FOO_PROJECT_ROOT)에 동의하여 팀의 모든 구성원이 자신의 환경에서 적절하게 설정됩니다. 이 지점에서부터 프로젝트를 포함한 상대 경로를 사용할 수 있습니다.

R 특정 접근법은 모든 팀원이 .Rprofile 파일에 설정하는 일부 데이터/기능에 동의하는 것입니다. 예를 들어, devtools이 비표준 위치에서 패키지를 찾는 방법입니다.

마지막으로 중요한 것은 아니지만 개발자에게 적합한 코드를 저장소에 넣을 수 있습니다. @ 할리가 그렇게한다면, 그렇게 나쁜 것은 아닙니다. 예를 들어 자신의 환경에서 그는 activates certain behaviorstestthat에 어떻게 보입니까? 예 내에서 비 ​​RData에 파일 가져 오기

+0

이것도 좋은 정보입니다, 많이 감사드립니다. – JPMac