2016-06-15 11 views
-5

magrittrパッケージの配管オペレータ%T>%を使用するR式があります。しかし、私はそれが何を正確に把握することはできません。誰でもこの式が何をしているのか、配管オペレータなしでどのように書くことができるでしょうか。ここでR:配管式

dataframe %T>% {variable_name <<- .[condition,sum(another variable)]} 

は、条件が

size > 100 

のようなものであり、他の変数はいずれも大きさや長さは、データフレーム内の変数です

length 

のようなものです。

+0

https://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html – zacdav

+3

あなたはどのように言及する必要がありますこのオペレータが定義されているパッケージ。実際、再現可能な例を共有する必要があります。 – Roland

+0

こんにちは@jim、ヘルプファイル(help( "%T>%") 'とタイプしてください)を読んでみてください。あなたがまだ理解していないことを言う。 'condition'と' another variable'などは何を表していますか?それは途中で 'magrittr'パッケージに入っています。 – Bazz

答えて

1

%T>%は、「tee」演算子です。 magrittr's vignetteで定義されたとおり

%T>%作品を%>%ように、それは左側の値ではなく、右側操作の結果を返す除い。言い換えれば

あなたはティー演算子を使用する場合:

  1. ティーはティー前から
  2. パイプ「再起動」を行って、そしてティーの後に機能するためにスキップされた後の動作。

ティーを組み合わせることができます。 {..}と組み合わせる

は、複数のことを行うために使用することができ、例えばggplot2グラフ:フィルターiris副作用としてggplot2を作り出す上の最初の行を出力

library(dplyr) 
library(magrittr) 
library(ggplot2) 
iris %>% 
    filter(Sepal.Length > 5.2) %T>% 
    {print(ggplot(data=., aes(x=Petal.Length, y=Petal.Width)) + geom_point())} %>% 
    head 

。そのような場合には後者を印刷して生産する必要があります。

デッドエンドを避ける方法として、ティーオペレータが表示されます。たとえば、ggplot2gg/ggplotオブジェクトを返しますが、これはパイプを継続したいことではありません。通常は、パイプ内のあるポイントでグラフを作成してから、パイプを続行することができます。あなたの元の式でdataframeは、あなたがやっていることdata.table、あると仮定すると、

+0

私の例では、データフレーム$ {variable_name << - 。[size <100、sum(length)]として書くことができます – jim

+0

私は最初のステップは '<< - 'を避けることだと思います。あなたは何をしたいのかをパイプで表現できますか? –

+0

私が提供した公式は、私が見ているものです。私は非パイプの方法でそれを表現しようとしています – jim

0

は次のとおりです、conditionであなたのdataframeをサブセット化サブセットでother variableの合計を計算し、variable_nameと呼ばれるグローバル変数に合計を割り当て、内容を印刷しますdataframeです。

Vincent Bonhommeはすでに "tee"演算子の機能について説明しました。つまり、式はdataframeの値を返します。私は、ここでの混乱は式の.によって引き起こされると思います。help("%>%")から:RHSの別の場所でLHSを配置

多くの場合、あなたはRHSにLHSをお勧めします

を呼び出すには、 最初よりも、別の位置に呼び出します。この目的のために、ドット(。)をプレースホルダとして使用できます。例: の場合、y%>%f(x、。)はf(x、y)に等しく、z%>%f(x、y、arg = z)。

ここではあなたのポストでの表現の例です:

library(data.table) 
library(magrittr) 

dt <- data.table(x = 1:5, y = 5:1) 

# original expression 
dt %T>% {z1 <<- .[x > 2, sum(y)]} 
#  x y 
#  1: 1 5 
#  2: 2 4 
#  3: 3 3 
#  4: 4 2 
#  5: 5 1 

z1 
# [1] 6 

# equivalently 
z2 <- dt[x > 2, sum(y)]; dt 
#  x y 
#  1: 1 5 
#  2: 2 4 
#  3: 3 3 
#  4: 4 2 
#  5: 5 1 

# more verbosely 
z3 <- sum(subset(dt, x > 2)$y); dt 
#  x y 
#  1: 1 5 
#  2: 2 4 
#  3: 3 3 
#  4: 4 2 
#  5: 5 1 

all.equal(z1, z2, z3) 
# [1] TRUE 
+0

2番目の式の"; dt "は何をしますか? – jim

+0

ああ、申し訳ありません。 'dt'をコンソールに出力するだけです。これは、通常のパイプオペレータの代わりに "tee"パイプを使用すると何が起こるかを再現するだけです。 –

+0

これは前のコマンドと同じ行に 'dt'を表示するだけです。 –