r 장고 전체 네임 스페이스를로드하지 않고 다른 패키지에서 하나의 함수 만 가져 오는 방법




장고 reverse (2)

memisc 패키지의 description 함수를 사용하고자하는 foo 라는 패키지를 개발 중이라고 가정 해 memisc . memisc 네임 스페이스 전체를 가져오고 싶지 않기 때문에 :

  1. 나쁘다.
  2. memisc 는 여러 가지를 memisc 기본 aggregate.formula 함수를 재정의합니다. 예를 들어, example(aggregate) 는 비참하게 실패합니다.

패키지에는 다음 파일이 포함됩니다.

기술

Package: foo
Version: 0.0
Title: Foo
Imports:
    memisc
Collate:
    'foo.R'

NAMESPACE

export(bar)
importFrom(memisc,description)

R / foo.R

##' bar function
##'
##' @param x something
##' @return nothing
##' @importFrom memisc description
##' @export

`bar` <- function(x) {
    description(x)
}

importFrom 을 사용하면 전체 memisc 네임 스페이스가로드되지 않지만 namespace::description 만로드한다고 생각합니다.하지만이 경우는 아닙니다. 바닐라 R로 시작 :

R> getS3method("aggregate","formula")
## ... function code ...
## <environment: namespace:stats>
R> library(foo)
R> getS3method("aggregate","formula")
## ... function code ...
## <environment: namespace:memisc>
R> example(aggregate)
## Fails

그럼, 내 환경에서 aggregate.formulamemisc 않고 memisc 에서 description 함수를 가져올 수있는 방법을 알고 계십니까?


당신은 할 수 없습니다.

Imports: 필드에 memisc 를 선언하면 패키지가로드 될 때 네임 스페이스가로드되고 패키지에서 내 보낸 객체를 찾을 수 있습니다. Depends: 지정하면 네임 스페이스가로드되고 검색 경로에 첨부되어 내 보낸 개체를 모든 코드에서 찾을 수 있습니다.

네임 스페이스를로드하는 부분은 제네릭에 메소드를 등록하는 것입니다. (나는 보았지만 이것을 말하는 표준 문서를 찾을 수 없었다; 함수가 NAMESPACE 파일의 S3 메소드로 증거로 선언된다는 사실에 호소 할 것이다.) 정의 된 메소드는 generic과 함께 유지되며 제네릭 함수 (또는 아마도 제네릭 함수의 네임 스페이스).

일반적으로 패키지는 작성한 제네릭 또는 패키지가 정의한 클래스에 대해 메소드를 정의합니다. S3 객체 시스템은 S3 클래스 (또는 그 클래스를 생성 한 패키지)를 형식적으로 정의하는 메커니즘을 가지고 있지 않지만, 패키지가 그 클래스 속성을 가진 객체를 반환하는 함수를 정의한다면 (그리고 그 패키지가 그 클래스는 그 패키지의 클래스입니다. 이 두 가지 조건 중 하나라도 유지되면 문제가 발생하지 않습니다. generic이 패키지에 정의되어 있으면 패키지가 첨부 된 경우에만 generic을 찾을 수 있습니다. 클래스가 패키지에 정의되어있는 경우 패키지가 연결되어 사용될 경우 해당 클래스의 객체 만 존재하므로 (따라서 디스패치됩니다)

memisc 예제에서는 어느 것도 유지되지 않습니다. aggregate 제네릭은 stats 패키지에 정의되어 있으며 formula 객체도 stats 패키지에 정의되어 있습니다 ( as.formula , [.formula 등을 정의하는 해당 패키지를 기반으로합니다). memisc 의 일반도 아니고 memisc 의 객체도 memisc 때문에 , memisc 가 단순히로드되지만 첨부되지 않은 경우에도 효과를 볼 수 있습니다 (및 메소드 전달).

reorder.factor 를 사용하여이 문제의 또 다른 예를 보려면 Reordering factor reorder.factor 드 된 패키지에 따라 다른 결과를 제공하는 것을 참조하십시오.

일반적으로 패키지가 객체 또는 일반을 제어하지 않는 제네릭에 메서드를 추가하는 것은 좋지 않습니다. 코어 패키지의 메소드를 오버라이드하는 경우에는 두 배가됩니다. 핵심 패키지의 기존 기능에 대한 하위 호환 기능이 아닌 경우 심각하게 그렇게합니다.

예를 들어, memisc::describe 코드를 패키지에 복사하는 것이 더 memisc::describe ,이 접근법에는 자체적 인 문제점과주의 사항이 있습니다.


R 환경과 네임 스페이스에 익숙하지 않다는 점과 이것이 패키지 내에서 작동하는지에 대해서도 언급하지 않았다. 프로그래밍에서 사용한 해결 방법은 :: 를 사용하여 함수를 내 자신의 함수로 복사하는 것이다.

OP의 질문에 대한 설명에서 언급했듯이 전체 패키지를로드 한 결과는 알 수 없지만 패키지의 함수 이름을 R 네임 스페이스에 첨부하고 기존 함수 이름을 마스크하지 않는 것 같습니다.

예:
my_memisc_description <- memisc::description







namespaces