2016-10-24 10 views
4

と無名関数のパラメータとして誰かが私に説明できます:なぜ使用できないのですか? 2つの以下の手順は異なる出力を持っている理由%>%

library(plyr) 
library(dplyr) 
ll <- list(a = mtcars, b = mtcars) 
# using '.' as a function parameter 
llply(ll, function(.) . %>% group_by(cyl) %>% summarise(min = min(mpg))) 
# using 'd' as function parameter 
llply(ll, function(d) d %>% group_by(cyl) %>% summarise(min = min(mpg))) 

前者の場合は明らかにしても、私はスペルミスsummariseで考え出した(評価されていません。 llply(ll, function(.) . %>% group_by(cyl) %>% sumamrise(min = min(mpg)))ではなく、はエラーをスローする)。

これはスコープのルールと物事が評価される場所とすべて関係しますが、実際に何が起こっているのか、そしてなぜこれが起こるのかを本当に知りたいですか?私は匿名関数の引数として.を頻繁に使用しており、結果を見るのは困惑していました。

長い話が短いので、なぜ.%>%と連携しないのですか?

答えて

1

.(「ドット」)は複数の用途があり、そのうちの1つが実際に引数として使用されます。どのように実際に解釈されるかは、そのコンテキストに大きく依存しています。そして、あなたの文脈では、それは%>%フォワードパイプオペレータの直前で使用されています。 dplyrmagrittrからその前方パイプ演算子を取り、magrittrドキュメントから、私たちは. %>% somefunction()があるときに何が起こるかに次のコードを持っている:

ドットがLHSとして使用する場合、結果は機能性配列となり、右辺のチェーン全体を入力に順番に適用する関数です。

これは、ドットが機能的シーケンスの一部としてドットを解釈した直後に、操作の事柄とほとんど同じです。%>%です。あなたの.引数として理解し得るために

一つの方法ではなく、すなわち、その周りにブラケットを追加することです.%>%、お互いとの相互作用の異なる用途のより完全な説明については

llply(ll, function(.) (.) %>% group_by(cyl) %>% summarise(min = min(mpg))) 

は、 https://cran.r-project.org/web/packages/magrittr/magrittr.pdfを見ています。関連するセクションは8ページから始まります。

+0

正しいドキュメントを指してくれてありがとう、今はかなり明確になっています。私はこの答えがもう少し理由を説明していると思います – thothal

3

これは、配管を使用するときにプレースホルダーとして.が特別に使用されたためです。 ?"%>%"から:多くの場合、LHSのいくつかの属性または特性 がRHSに望まれる二次目的

のドットを使用

、例えば、LHS 自体の値に加えて、呼び出し行数または列数。 がRHSで数回呼び出すドットプレースホルダを使用することは完全に有効ですが、それは内部の 関数呼び出しを入れ子に使用する際の設計 によって挙動が若干異なっています。特に、プレースホルダがネストされた関数呼び出しの でのみ使用されている場合、lhsも最初の引数として配置されます。 これは、ほとんどのユースケースでは、最も多くのコードが であることがわかります。例えば、虹彩%>%サブセット(1:nrow()%% 2 == 0)アイリス%>%サブセットに相当 である(1:nrow()%% 2 == 0)が、わずかに よりコンパクト。この動作を覆すには、 rhsを中括弧で囲むことができます。たとえば、1:10%>%{c(min(。)、max(。))}はc(min(1:10)、max(1:10))に相当する です。

+0

基本的にはRTFM - 自分自身を理解できたかもしれませんが、私はそれが非常に特殊なケースだと思ったのでこの問題に困惑していました;) – thothal

関連する問題