これはかなり単純な質問です。しかし、私はグーグル/スタックエクスチェンジごとに答えを見つけることができず、magrittrのドキュメントを見ました。ベクトルを作成するために%>%を介して接続された一連の関数の結果をどのようにフィードしますか?
私がほとんどの人がしているのを見たのは:
a <-
data.frame( x = c(1:3), y = (4:6)) %>%
sum()
しかし、結果をパイプチェーンしてオブジェクトにフィードすることができるソリューションもあります。おそらく、次のようなエイリアスやsthなどです。
data.frame( x = c(1:3), y = (4:6)) %>%
sum() %>%
a <- ()
これは、結果を「パイプの下」に送るという同じロジックですべてのコードを維持するのに役立ちます。
これを試して:
data.frame( x = c(1:3), y = (4:6)) %>% sum -> a
あなたはそのようにそれを行うことができます:
data.frame( x = c(1:3), y = (4:6)) %>%
sum %>%
assign(x="a",value=.,pos=1)
注意すべき点がいくつかあります。
「。」を使用できます。転送されるオブジェクトがどの引数に属するかをmagrittr
に通知します。デフォルトでは最初の引数ですが、ここでは.
を使用して、2番目のvalue
にそれが必要であることを示します。代わりに引数。
次に、pos=1
引数を使用して、グローバル環境で割り当てを行う必要がありました。
<<-
演算子を使用することもできます。
data.frame( x = c(1:3), y = (4:6)) %>%
sum() %>%
`<<-`(a,.)
編集: John Paulが最も安全な提案だと思います。チェーンを続けて、部分的な結果のさまざまな割り当てを行うことができます。 。例えば:
data.frame( x = c(1:3), y = (4:6)) %>%
sum %>%
assign(x="a",value=., pos=1) %>%
exp %>%
assign(x="b",value=., pos=1) %>%
sqrt %>%
assign(x="c", value=., pos=1)
これにより、a
、b
、およびc
が正しく作成されます。
私がやりたいこと(そして私が覚えていないところにこのトリックを見つけた)は、パイプチェーンの最後に{.} -> obj
を使用することです。このようにして、新しい行を挿入するだけでチェーンの最後にステップを追加でき、->
代入演算子に再配置する必要はありません。
(.)
の{.}
isnteadを使用することもできますが、少し見えますodd。
たとえば、これの代わりに:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) -> summary
これを行う:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>%
{.} -> summary
パイプされたデータがどこに到達するかを簡単に確認できます。また、大したことではないように見えますが、->
を新しい行に移動する必要がなく、{.}
の前に新しい行を追加してステップを追加するだけなので、別の最終ステップを追加する方が簡単です。
そのようです:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>%
arrange(desc(mean.petal)) %>% # just add a step here
{.} -> summary
ただし、これは中間結果の保存には役立ちません。 assign()を使用するというJohn Paulの答えは素晴らしいですが、入力するのに少し時間がかかります。データは最初の引数ではないため、.
を使用する必要があります。新しい引数の名前を""
に入力し、環境(pos = 1
)を指定する必要があります。私の側では怠惰に思えますが、%>%
の使用は約速度です。
そこで、assign()
を小さな関数でラップして、少し高速化しました。
keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}
だから今あなたはこれを行うことができます:
keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>% keep(unsorted.data) %>% # keep this step
arrange(mean.petal) %>%
{.} -> sorted.data
sorted.data
# Species mean.petal mean.sepal
#1 setosa 1.462 5.006
#2 versicolor 4.260 5.936
#3 virginica 5.552 6.588
unsorted.data
# Species mean.petal mean.sepal
#1 setosa 1.462 5.006
#2 versicolor 4.260 5.936
#3 virginica 5.552 6.588
PipeRの%>>%
を使用すると、これは非常に簡単です。
library(pipeR)
data.frame( x = c(1:3), y = (4:6)) %>>%
sum %>>%
(~ a)
PipeRチュートリアルが役立つ場合があります: http://renkun.me/pipeR-tutorial/ 割り当ての場合: http://renkun.me/pipeR-tutorial/Pipe-operator/Pipe -with-assignment.html