R:自己記述型パッケージでmagrittrパイプ演算子を使用する


100

データ変換をチェーンするために、自分で作成%>%したmagrittrパッケージで、パッケージに導入されているパイプオペレーターを使用したいと思いdplyrます。ファイルのmagrittrようImportにリストされDESCRIPTIONます。自分のパッケージをロードし、パイプオペレーターを使用する関数をテストした後、次のエラーメッセージが表示されます。

functionname(parameter、:でエラーが発生し、関数 "%>%"が見つかりませんでした

関数のソースコード%>%magrittr::%>%に変更しても、パッケージをビルドできなくなるため、効果がありません。


4
パッケージ内の関数内のパイプ演算子には反対のアドバイスをします。これはデバッグを非常に困難にします(コールスタックはパイプでめちゃくちゃ深くなります)。パッケージの場合は一時変数を上書きするだけなので、テストが非常に簡単になります(Rがエラーが発生した行を教えてください)。パイプはインタラクティブな使用には問題ありませんが、プログラミングには負担がかかります。

回答:


100

magrittrリストされていれば、正しく機能しているはずですDepends。ただし、これはお勧めできません。代わりに、そのままmagrittrImportsして次の行をに追加しますNAMESPACE

importFrom(magrittr,"%>%")

ライティングR拡張機能を読むことをお勧めします。あなたの質問はパラグラフ1.1.3と1.5.1でカバーされています。


1
@alexanderkethその場合は、回答の横にある緑色のチェックマークをクリックして、回答済みとしてマークする必要があります。SOへようこそ!
トニートノフ2015年

54
を使用している場合はroxygen2、を追加#' importFrom magrittr "%>%"して、NAMESPACEが中に自動的に入力されるようにすることができますroxygenize()
RomanLuštrik2015

38
RomanLuštrik@だけ@を逃し、あるべき#' @importFrom magrittr "%>%"
Roah

13
これは%>%、パッケージの内部でのみ使用できることに注意してください。APIでユーザーがを使用して関数をチェーンする必要がある場合%>%でも、明示的にロードする必要がありますmagrittr。この問題を解決する1つの方法は、関数を再エクスポートすることです。ここでにそれを行う方法の。
Ramnath

これは、上述したようusethisパッケージには、何もあり、ここで
jiggunjer

32

1つの追加のソリューション- roxygenパッケージを使用します。devtoolsパッケージの一部として実装されています。一度devtoolsインストールされている、呼び出しdevtools::document()あなたを更新しますNAMESPACEあなたのため。また、ドキュメント付きの.Rdファイルを自動ビルドするので便利です。

あなたがする#' @import packagenameすべては、そのパッケージからすべての関数#' @importFrom packagename functionnameをインポートするか、関数をインポートするために、ファイルにフォーマットで特別なコメントを追加することです。これらのコメントはファイルにいくつでも入れることができるので、各ファイルの上部に、または外部関数を必要とする各関数とともに、コメントのセットを含めることができます。

次に、実行するdevtools::document()と、コードを解析してそれらのコメントを探し、適切なNAMESPACEファイルを作成します。簡単です。


1
これを行うと、Rスクリプトの最初の関数のヘルプファイルに関連する次の酸素のコメントがめちゃくちゃになります。グローバル酸素コメントをヘルプファイルのコメントから分離するにはどうすればよいですか?
jzadra 2017年

2
私は通常、各関数に個別にインポートコメントを付けます。そうすることで、ファイル内の他の関数が変更されても、インポートは正確なままです。したがって、グローバルな定義はありません。
Mike Stanley

32

パッケージでパイプをサポートする簡単な方法があります。素晴らしいパッケージusethisには機能がありますuse_pipe()。その関数を1回実行すると、すべてが処理されます。これは、use_pipe()関数がusethisドキュメントで説明されている方法です:

パッケージの内部でmagrittrのパイプを使用し、パッケージのユーザー向けに再エクスポートするために必要な設定はありますか?

説明の「インポート」にmagrittrを追加します

必要なroxygenテンプレートを使用してR / utils-pipe.Rを作成します


use_pipe()パッケージのビルドに使用するコードに行を追加しますか?たとえば、次のコマンドを実行しますusethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)use_pipe()最初に追加するだけですか?
Josh、

1
@Josh usethisパッケージを開発しているときに一度関数を使用します。これらの関数は、必要な部分をビルド命令とその他すべてに追加します。
AndrewBrēza19年

18

HadleyのdevtoolsパッケージであるRStudioを使用していてmagrittrDESCRIPTIONファイルのImportsセクションにリストされていると仮定して%>%、パッケージ関数で機能させるために実行した手順を次に示します。

まず、関数を書きますfoo.R

#' Convert \code{data.frame} to \code{list}.
#' 
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
#' @param x A \code{data.frame} object.
#' @examples
#' my_result <- foo(iris)
#'
foo <- function(x) {
    x %>%
        as.list()
}

次に、を実行しdevtools::document()ます。

3番目に、を実行しdevtools::load_all()ます。

このようなファイルがR/ディレクトリに作成され、関数は期待どおりに機能するはずです。


6
@name %>%ここの目的は何ですか?
JelenaČuklina
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.