21

私はRが初めてで、ブラケット恐怖症に苦しんでいることを発見しました(リンクのコメントを参照)。場合によってはネストされた括弧が回避され、コードが読みやすくなるため、magrittr表記法が機能する方法が気に入っています。%>%私は から来ました、何をするかについてMathematica非常によく似たネイティブ表記法があります。R と Mathematica の比較を次に示します。//%>%

#R Notation    
c(1.5,-2.3,3.4) %>% round %>% abs %>% sum  

#Mathematica Notation
{1.5,-2.3,3.4}//Round//Abs//Total

ここまでは順調ですが、私の質問は次のとおりです。

Mathematica の @ 記法を模倣して、右から左への結合を行う方法はありRますか?

上記の同じコードを解くために、Mathematica でどのように機能するかを次に示します。

Total@Abs@Round@{1.5,-2.3,3.4}

Mathematica では、次のように書くこともできます。

Total[Abs[Round[{1.5,-2.3,3.4}]]]

次のようにRなります。

sum(abs(round(c(1.5,-2.3,3.4))))

Rしかし、次のようなものを含めると、はるかにクリーン (かつクール) になります。

sum@abs@round@c(1.5,-2.3,3.4)

PS:@が S4 クラスで使用されていることはわかっていますが、これはお勧めできません。これは単なる例示的な比較です。

4

3 に答える 3

16

私はこれについて慎重にテストしたり考えたりしていませんが、演算子を介して関数構成を定義する (以下のように) は、いくつかのテストケースで機能するようです:

library(magrittr)

## operator defined as  "left-pointing arrow" at the 
##    suggestion of @ClausWilke:
"%<%" <- function(x,y) { if (is(y,"function")) 
          function(z) x(y(z)) 
      else x(y) }

x <- c(1.5,-2.3,3.4)
all.equal(x %>% round %>% abs %>% sum,
          sum %<% abs %<% round %<% x)

x <- rnorm(1000)
all.equal(x %>% round %>% abs %>% sum,
          sum %<% abs %<% round %<% x)

構文は、構成演算子に単一の文字 ( など@) を使用できるほど優れていませんが、使用されていないものを見つけることができたとしても (明らかなもの[!@#$%^&*~|]はすべて取得され、それらをマスクするのはひどい考えです)、パーサーの制限: R のユーザー定義の二項演算子は、形式でなければなりません%?%

于 2015-07-11T17:42:54.067 に答える
8

composehadley のpurrrパッケージから使用するのはどうですか?

compose(sum,abs,round,c)(1.5,-2.3,3.4)
于 2015-07-11T18:21:47.770 に答える
7

backpipeパッケージは、この目的のために設計および作成されました。これは、 magrittrpipeR、および通常はすべての前方パイプ演算子に対して 、バックパイプ (右から左) 演算子を提供します。backpipegithubCRANにあります。

library(magrittr)  # or library(pipeR)
library(backpipe)

x <- c(1.5,-2.3,3.4)
sum %<% abs %<% round %<% x

all.equal(                             # TRUE
      x %>% round %>% abs %>% sum,
      sum %<% abs %<% round %<% x
)

@BenBolkerのソリューションの場合のように、バックパイプも追加のパラメーターによって制限されません。たとえば、これはbackpipeで機能します。

mean(na.rm=TRUE) %<% c(1:3,NA)  

これについて議論しているmagrittr github issueの議論も参照してください。

于 2015-09-03T17:04:35.443 に答える