2011-09-02 3 views
29

R의 네임 스페이스 메커니즘을 사용하면 사용자가 볼 수있는 기능을 export 개까지 허용합니다. 또한 다른 패키지의 기능을 import까지 허용합니다. 수출 이익은 명백하지만 수입의 혜택을 이해하는 데는 더 많은 어려움이 있습니다.R의 네임 스페이스에서 가져 오기의 이점은 무엇입니까?

하나의 이점은 패키지를 부착하지 않고 다른 패키지의 기능을 사용하여 메모리를 절약 할 수 있다는 것입니다. 이는 섹션 1.6.4 in the writing R extensions manual에 예시되어 있습니다.

그러나 가져 오기 기능의 다른 이점이 있어야합니다.

export(mle) 
importFrom("graphics", plot) 
importFrom("stats", optim, qchisq) 
## For these, we define methods or (AIC, BIC, nobs) an implicit generic: 
importFrom("stats", AIC, BIC, coef, confint, logLik, nobs, profile, 
      update, vcov) 
exportClasses(mle, profile.mle, summary.mle) 
## All methods for imported generics: 
exportMethods(coef, confint, logLik, plot, profile, summary, show, update, vcov) 
## implicit generics which do not have any methods here 
export(AIC, BIC, nobs) 
여기

(that section의 예제에 설명 된대로 그것뿐만 아니라 가져 오기를 사용하는 것이 나을)도 S4 클래스도 제네릭이 수입 된 기능이 있습니다 : 특히, section 1.6.6 (that deals with S4 classes)는 stats4 패키지의 namespace을 보여줍니다 R이 시작될 때 자동으로로드되는 graphics 패키지의 plot과 같은 기능을 수행합니다.

따라서 내 질문은 plot, optim 또는 qchisq과 같은 함수 가져 오기의 이점은 무엇입니까?

답변

23

패키지 바에서 기능 foo을 가져온 경우 사용자가 검색 경로에 어떤 작업을 수행하든 (예 : 기능이 foo 인 패키지 Baz를 첨부하여) 검색됩니다. 이름 공간이 없으면 갑자기 패키지 코드가 Baz::foo을 사용하여 찾습니다. 효율성 문제 (foo는 검색 경로의 모든 심볼을 검색 한 후에가 아니라 즉시 발견 됨)가 있지만 대부분의 응용 프로그램에서는 사소한 문제 일 수 있습니다. 마찬가지로 importFrom은 충돌이 적어 (의도하지 않은 기능을 사용함)보다 효율적인 조회가 가능하므로 import 이상의 개선 사항입니다.

S4 (및 S3)를 사용하면 상당히 복잡해 질 수 있습니다. graphics::plot과 같은 비 - 제네릭 함수는 두 개의 서로 다른 패키지에서 일반 (setGeneric)으로 승격 될 수 있으며 각 제네릭에는 고유 한 메서드 세트가 첨부 될 수 있습니다. 패키지 작성자는 plot generic에 대한 정확한 정보를 원할 것이므로 어떤 메소드 디스패치 테이블, 클래스 및 메소드를 참조하십시오.

pkg::foo을 사용하여 함수를 호출하면 항상 의도 한 함수로 해석됩니다. pkg이 DESCRIPTION 파일의 Depends : 필드에 나열되어야합니다 (수입시 : 어쩌면 pkg에서 가져 오지 않는 오도 된 광고와 같음). 그러면 사용자의 검색 경로가 오염됩니다. 또한 두 개의 심볼 검색과 함수 호출 (::)을 포함하므로 효율성이 떨어집니다. 나에게 게으르고 부족한 부분까지도 ::을 지루하고 오류가 발생하기 쉽습니다. (사용자 이름과 암호 readonly와 SVN을 통해)

패키지 codetoolsBioC

기존 패키지에서 네임 스페이스 파일을 생성 할 수 있습니다 (또는 적어도 그 수 R-(STABLE)에 대한 최근 변경 이전에 한하지 않고 패키지에 대한 네임 스페이스를 도입, 내가하지 않은 이러한 패키지에서 codetoolsBioC를 시도했습니다.)

+0

즉, 그러한 함수를 임포트하는 것은 일반적인 것을 홍보하려는 경우에만 의미가 있습니까? (검색 경로에 'plot'이라는 다른 함수가 없다고 가정하고 싶다면 – Henrik

+2

패키지가 사용하는 base가 아닌 다른 패키지에서 항상 함수를 임포트하는 것이 좋습니다. 일부 제 3의 패키지는'plot = function (...) '함수를 정의합니다. "당신의 코드가 깨지는 것을 이야기하는 좋은 이야기가 있습니다.사용자는 검색 경로를 제어 할 수 없습니다. –

+0

그러나 나는 항상'::'연산자를 사용하여 함수를 호출하는 경우 (예 :'plot()'대신 항상'graphics :: plot()') 패키지가 이미 연결되어있는 경우에도 가져 오기의 이점이 있습니까? – Henrik

관련 문제