2017-05-04 9 views
5

magrittrパイプシンタックスで何かの理由で再生していて、 スコープ が明示的にコールを修飾したときに発生する奇妙なエラーが発生しました。 %>%。私は以下の構文を使ってパイプの目的を破壊することを知っていますが、なぜエラーが発生するのか不思議です。`` magrittr ::%%> `` `` `を使用しているときのmagrittrパイプのエラー

sumへの最初の呼び出しは、期待通りに機能し、1を出力します。

2番目の呼び出しでは、エラー:Error in pipes[[i]] : subscript out of boundsが発生します。私は環境を操作する最初の行に関連して、エラーの原因を考えているパイプのソースコードを見ると、私はそれが導入だことが何を問題と確信している

library(magrittr) 

`%>%`(1,sum()) 
magrittr::`%>%`(1,sum()) 

function (lhs, rhs) { 
    parent <- parent.frame() 
    env <- new.env(parent = parent) 
    chain_parts <- split_chain(match.call(), env = env) 

誰でもこの動作を説明できますか?

+2

小規模の訂正:これは*スコープ*ではありません*明示的に名前を修飾していません。スコープは通常、ここでは変更されない実行環境を示します。 –

答えて

6

pipe引数(%>%、%$%、etc ...)はすべて実際にはmagrittrのpipe()関数と同じです。機能する最初のものの1つは、内部のエクスポートされていない関数split_chainを使用して呼び出しをその構成部分に分割することです。

split_chain()コール(この場合には、使用される機能、パイプ演算子のいずれか)の最初の要素を取得し、ように見えるis_pipe()と呼ばれる別の内部、非エクスポートされた関数を介してそれを実行:

function(pipe) 
{ 
    identical(pipe, quote(`%>%`)) || 
    identical(pipe, quote(`%T>%`)) || 
    identical(pipe, quote(`%<>%`)) || 
    identical(pipe, quote(`%$%`)) 
} 

これが真ではない場合、関数は終了し、問題を引き起こす引数の右辺とパイプ型がないリストを返します。スコープを設定すると、にはコールの最初の部分に明示的なスコープが含まれているため、これらのハードコードされたチェックに失敗します。

+1

うん! 'is_pipe'関数を編集して各パイプのスコープ付きバージョンを組み込み、' magrittr'を再構築するとエラーを解決します –

関連する問題