2017-05-04 5 views
5

어떤 이유로 내가 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(`%$%`)) 
} 

이것이 참이 아닌 경우 함수는 파이프 유형이 누락 된 목록과 문제의 원인이되는 인수의 오른쪽 부분을 반환하고 종료합니다. 범위를 지정할 때의 호출의 첫 번째 부분에는 명시 적 범위가 포함되므로 이러한 하드 코딩 된 검사가 실패합니다.

+1

예! 'is_pipe' 함수를 편집하여 각 파이프의 범위 버전을 포함하고'magrittr '를 재 작성하면 오류가 해결됩니다 –