2016-08-31 4 views
0

다른 R 패키지의 S4 클래스와 동일한 이름으로 내 S4 클래스를 사용하고 유지하는 방법은 무엇입니까?다른 R 패키지의 S4 클래스와 동일한 이름으로 내 S4 클래스를 사용하고 유지하는 방법은 무엇입니까?

'FeatureSet'이라는 S4 클래스가 포함 된 대형 R 패키지를 작성하고 있습니다. 불행히도, 이것은 널리 사용되는 'oligo'패키지의 가상 S4 클래스의 이름이기도합니다. 내가

new("FeatureSet") 

를 내 첫 번째 패키지, 다음 올리고을로드하고 호출 할 때 나는 네임 스페이스 파일에서

Error in new("FeatureSet") : 
    trying to generate an object from a virtual class ("FeatureSet") 

, 나는 'exportClasses'와 'exportClassPattern'수출을 포함하여 시도했습니다 오류를 얻을 이 S4 정의, 또는 모든 S4 정의, 내 패키지에서 운없이. 또한 내 패키지에 제네릭에 대한 메서드를 정의한대로

exportMethods(coerce, initialize, show) 

을 포함 시켰습니다.

같은 이름의 여러 정의가 첨부 된 경우 특정 S4 정의 만 인식하도록 R 코드를 작성하는 가장 좋은 방법은 있습니까? 물론 수업에 다른 이름을 붙일 수는 있지만, 앞으로 수업이 다른 패키지와 충돌하지 않도록하는 방법이 있어야합니다. 나는 평소 포럼과 문서를보고 꽤 많은 시간을 보냈으며이 질문이 어디서나 대답되지 않았 음을 알면 놀랐다. 미리 감사드립니다!

답변

1

최선의 방법은 다른 설명적인 이름을 선택하는 것입니다. 같은 이름이지만 구조가 다른 두 개의 객체를 갖는 것은 본질적으로 혼란 스럽습니다.

당신은 아마 간단한 '생성자'기능에 싸여

new(getClass("FeatureSet", where=getNamespace("YourPackage")))` 

를 통해 '당신'클래스의 인스턴스를 구성 할 수 있습니다.

원칙적으로 메소드 패키지는 클래스의 인스턴스와 다른 패키지의 같은 이름의 클래스 사이의 차이를 '알고'있지만 실제로 구현 버그가 발생하여 사용자와 사용자를 좌절시킬 수 있습니다.

+0

대단히 감사합니다. @ Martin-Morgan! 위의 설명과 비슷한 것을 가지고 놀기 시작했는데, where = getNameSpace ("MyPackage")'대신에'envir = as.environment ("MyPackage")'를 사용하려고했습니다. 필자는 내 패키지의 모든 S4 클래스 이름에 접두어를 추가하기로 결정했습니다 (많은 경우 FeatureSet과 같이 상당히 일반적인 이름이 붙어 있습니다). 이후의 충돌을 막아야합니다. –

관련 문제