2017-05-04 108 views
5

由於任何原因,我在玩magrittr管道語法,並遇到一個奇怪的錯誤,當 範圍 明確限定呼叫%>%。我知道使用下面的語法破壞了管道的用途,但我很好奇爲什麼發生錯誤。當使用``magrittr ::`%>%```magrittr ::`%>%``````````

sum的第一個呼叫按預期工作,並輸出1

第二次調用導致錯誤: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

管道參數(%>%,%$%等)實際上與magrittr中的pipe()函數相同。該功能所做的第一件事之一是使用內部非導出功能split_chain將呼叫拆分爲其組成部分。

split_chain()取呼叫的第一個元素(所使用的功能,在這種情況下,管道運營商中的一個)並運行它通過另一個內部,非出口稱爲is_pipe()函數看起來像:

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

如果這不返回true,則函數退出返回缺少管道類型的列表和導致問題的參數的右手邊。在確定範圍時,調用的第一部分包含顯式範圍界定,因此它會使這些硬編碼檢查失敗。

+1

是的!編輯函數'is_pipe'以包含每個管道的作用域版本並重建'magrittr'解決錯誤 –

相關問題