web-dev-qa-db-ja.com

パイプチェーン(magrittr)の結果をオブジェクトにフィードする方法

これはかなり単純な質問です。しかし、私はグーグル/スタックエクスチェンジごとに答えを見つけることができず、magrittrのドキュメントを見ました。ベクトルを作成するために%>%を介して接続された一連の関数の結果をどのようにフィードしますか?

私がほとんどの人がしているのを見たのは:

a <-
data.frame( x = c(1:3), y = (4:6)) %>%
sum()

しかし、結果をパイプチェーンしてオブジェクトにフィードすることができるソリューションもあります。おそらく、次のようなエイリアスやsthなどです。

data.frame( x = c(1:3), y = (4:6)) %>%
sum() %>%
a <- ()

これは、結果を「パイプの下」に送るという同じロジックですべてのコードを維持するのに役立ちます。

21
grrgrrbla

これを試して:

data.frame( x = c(1:3), y = (4:6)) %>% sum -> a
25
G. Grothendieck

あなたはそのようにそれを行うことができます:

data.frame( x = c(1:3), y = (4:6)) %>%  
sum %>%  
assign(x="a",value=.,pos=1)  

注意すべき点がいくつかあります。

「。」を使用できます。転送されるオブジェクトがどの引数に属するかをmagrittrに通知します。デフォルトでは最初の引数ですが、ここでは.を使用して、2番目のvalueにそれが必要であることを示します。代わりに引数。

次に、pos=1引数を使用して、グローバル環境で割り当てを行う必要がありました。

13
John Paul

<<-演算子を使用することもできます。

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)

これにより、ab、およびcが正しく作成されます。

5
Carlos Cinelli

私がやりたいこと(そして私が覚えていないところにこのトリックを見つけた)は、パイプチェーンの最後に{.} -> 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
3
ccoffman

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

3
Kun Ren