2017-05-04 21 views
5

Vì lý do gì tôi đang chơi với cú pháp ống magrittr và gặp lỗi lạ xảy ra khi bạn phạm vi rõ ràng đủ điều kiện cuộc gọi đến %>%. Tôi biết rằng bằng cách sử dụng cú pháp dưới đây phá hủy mục đích của đường ống, nhưng tôi tò mò là tại sao lỗi xảy ra.Lỗi trong ống magrittr khi sử dụng `` magrittr :: `%>%` ``

Cuộc gọi đầu tiên tới sum hoạt động như mong đợi và xuất ra 1.

Cuộc gọi thứ hai gây ra lỗi: Error in pipes[[i]] : subscript out of bounds.

library(magrittr) 

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

Nhìn vào mã nguồn của đường ống Tôi đang nghĩ nguyên nhân lỗi có liên quan đến dòng đầu tiên thao túng môi trường, nhưng tôi chắc chắn là vấn đề gì đang giới thiệu.

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

Có ai giải thích được hành vi này không?

+2

Chỉnh sửa nhỏ: đây không phải là * phạm vi * nhưng * đủ điều kiện rõ ràng tên *. Phạm vi thường biểu thị môi trường thực thi, không thay đổi ở đây. –

Trả lời

6

Đối số đường ống (%>%,% $%, v.v ...) là tất cả thực sự giống như hàm pipe() trong magrittr. Một trong những điều đầu tiên mà chức năng thực hiện là chia tách cuộc gọi thành các phần cấu thành của nó bằng cách sử dụng hàm nội bộ, không xuất khẩu split_chain.

split_chain() mất phần tử đầu tiên của cuộc gọi (chức năng sử dụng, trong trường hợp này, một trong những nhà khai thác đường ống) và chạy nó thông qua một phi xuất khẩu chức năng nội bộ, gọi is_pipe() trông giống như:

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

nếu điều này không trở lại đúng, chức năng thoát trở về danh sách thiếu kiểu ống và phía bên phải của đối số gây ra sự cố. Khi phạm vi, một la magrittr::'%>%' phần đầu tiên của cuộc gọi bao gồm phạm vi rõ ràng và do đó, nó không thành công kiểm tra mã hoá cứng.

+1

yep! chỉnh sửa hàm 'is_pipe' để bao gồm các phiên bản scoped của mỗi pipe và xây dựng lại' magrittr' giải quyết lỗi –

Các vấn đề liên quan