2017-10-27 13 views
3

NAMESPACEファイルを作成するためにdevtools :: document()を使用してRパッケージを開発しています。関数のいくつかはサマリー、予測、プロット、印刷用のS3メソッドであり、汎用はbaseまたはstatsです。 Hadleyが推奨するように@exportを使用していますが、これはNAMESPACEの正しいS3methodエントリにつながり、パッケージはすべてのチェックを-as-cranに渡します。しかし、関数はNAMESPACEでエクスポートされないので、print.myclassを呼び出すことはできません(NAMESPACEを乱雑にするのを避けるために望ましい動作です)。ただし、Mypackage :: print.myclassで関数を呼び出すと、関数がMypackageからエクスポートされたオブジェクトではないというエラーが発生します。NAMESPACEのS3メソッドがエクスポートされていません

質問:正しい動作ですか?または、関数をエクスポートするために必要な他のステップがありますか? @method print Myclassと@exportの両方を追加しようとしましたが、運がありません。 R 3.4.2と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

を構築し、ロードした後、それはあなたがprintの1回の呼び出しでprint.helloを使用する場合は、この場合には、あなたがhelloのクラスを入れなければならないだろう、である、質問*以下の例を試してみてくださいそれは正しい行動ですか?*私は正しい行動だと思います。 – 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でメソッドをディスパッチする場合に使用され、.の後の接尾辞は、関数の最初の引数として指定するオブジェクトのクラスを表す必要があります。あなたが成功し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からジェネリックを再定義したくないので、NAMESPACEを手作業で編集することなく、ルックの提案が機能します(2つの@exportステートメントを維持するとS3methodを定義し、select関数用にエクスポートできます)。 –

関連する問題