2017-10-27 7 views
3

dev30ools :: document()를 사용하여 R 패키지를 개발하여 NAMESPACE 파일을 만듭니다. 기능 중 몇 가지는 요약, 예측, 플롯, 인쇄용 S3 메소드이며, 일반은 base 또는 stats입니다. 해들리가 권장하는대로 @export를 사용 중이며 NAMESPACE의 올바른 S3method 항목으로 연결되며 패키지는 모든 검사에 -as-cran를 전달합니다. 그러나 함수는 NAMESPACE에 내 보내지 않으므로 print.myclass를 호출 할 수 없습니다 (NAMESPACE를 어지럽히는 것을 피하기 위해 원하는 동작임을 이해합니다). 그러나 Mypackage :: print.myclass 함수를 호출하면 함수가 Mypackage에서 내 보낸 개체가 아니라는 오류가 발생합니다.NAMESPACE의 S3 메서드가 내보내기되지 않았습니다.

질문 : 올바른 동작입니까? 아니면 함수를 내보내는 데 필요한 다른 단계가 있습니까? @method print Myclass와 @export를 추가하려고 시도했지만 행운은 없습니다. 사용하는 R 3.4.2 with devtools MAC OS X 10.12.6 이하 1.13.3

고마워! Merlise

편집 됨 : 추가하는 코드/내보내기 방법 및 내보내기 기능이 업데이트

간단한 예 - 기능 RStudio의 골격 패키지를 빌드 : 네임 스페이스가 지금 가지고

#' test for export of S3 methods 
#' 
#' @title "print hello world for any object" 
#' @param x object 
#' @param digits optional number specifying the number of digits to display 
#' @param ... other parameters to be passed to \code{print.default} 
#' @export print.hello 
#' @export 
print.hello = function (x, digits = max(3, getOption("digits") - 3), ...) 
{ 
    cat("\n Hello World \n") 
    invisible() 
} 

# Generated by roxygen2: do not edit by hand 

S3method(print,hello) 
export(print.hello) 

@export를 인수없이 사용하면 @export print.hello exports 이 함수는 NAMESPACE에 메소드를 추가하지는 않지만 (이는 패키지 검사에 오류가 발생할 수 있습니다). 둘 다 있으면 메소드와 함수를 내보낼 수 있습니다.

+0

* 질문을로드하는 것,이 경우에서, : 그게 올바른 행동입니까? * 나는 그것이 올바른 행동이라고 생각합니다. – Suren

답변

1

NAMESPACE 파일의 올바른 동작입니다. ::으로 내 보낸 변수이므로 testPackage::print.hello이 실패해야합니다. ::: 변수에 액세스하므로 testPackage:::print.hello을 사용해야합니다. 모든

1

첫째, 공식적으로 S3 방법을 정의하고 수동으로 네임 스페이스 파일을 변경하지 않고 제대로을 수출하기 위해

#' test for export of S3 methods 
#' 
#' @title "print hello world for any object" 
#' @param x object 
#' @param digits optional number specifying the number of digits to display 
#' @param ... other parameters to be passed to \code{print.default} 
#' 
#' @rdname print 
#' @export print 
print <- function(x, ...){ 
    UseMethod("print") 
} 

#' @rdname print 
#' @export print.hello 
#' @export 
print.hello <- function (x, digits = max(3, getOption("digits") - 3), ...) 
{ 
    cat("\n Hello World \n") 
    invisible() 
} 

, (당신이 roxygen를 사용하는 가정)이 더 많거나 적은 당신에게 예상되는 동작을 제공합니다 testPackage::print.hello입니다. 여기서 중요한 것은 S3 방법이 무엇인지 이해하는 것입니다. 이 메소드는 R로 디스패치하는 메소드에 사용되며 . 이후의 접미어는 항상 함수의 첫 번째 인수로 넣어야하는 객체의 클래스를 나타냅니다. 즉, print의 단일 호출로 print.hello를 사용하려는 경우, 당신은 hello의 클래스를 넣어이 성공적으로 빌드 한 후 아래의 예를 시도하고 testpackage에게

a = 1 
print(a) # method dispatched as print.default because class of a is numeric 
# 1 
class(a) <- 'hello' 
print(a) # method dispatched as print.hello 
# Hello World 
+0

이것은 자신 만의'print' 제네릭 함수를 정의하고 있습니다. 이것은 여러분이 원하는 것이 아닙니다. 이 코드에서'print'의 정의를 삭제하면됩니다. –

+0

감사합니다. 기본 R에서 제네릭을 재정의하고 싶지 않아 Luke의 제안이 작동합니다 (두 개의 @export 문을 유지하면 S3method를 정의하고 select 함수로 내보낼 수 있습니다). NAMESPACE의 수동 편집없이 roxygen을 사용합니다. –