2012-08-05 15 views
6

Tôi đã viết một hàm toán tử nhị phân cho R (ví dụ: một với tên như %X% để thay vì phải nhập %X%(a,b) Tôi có thể sử dụng cú pháp thuận tiện hơn a %X% b. Mục tiêu của tôi là có một hàm bao cho <-. được thực hiện cho các đối tượng trong môi trường đó và kiểm tra thuộc tính 'được bảo vệ' để cảnh báo người dùng trước khi ghi đè lên đối tượng đó. là a %X% b _và đó cũng là tất cả, một giá trị của b và c bị bỏ qua hoàn toàn a %X% (b + c) hoạt động và do đó, %X%(a, b + c) nhưng toàn bộ điểm viết này là ab nhà điều hành nội bộ là để tránh dấu ngoặc đơn.Trong R, làm thế nào để có được toàn bộ dòng lệnh vào sys.call() của một toán tử nhị phân?

Nếu tôi ghi đè <-, thì sys.call() sẽ thấy mọi thứ ở bên trái và bên phải của nó. Tại sao tôi chỉ nhìn thấy các tên liền kề từ dòng lệnh?

Đây là mã mà sao chép vấn đề này:

`%X%` <- function(...){ 
    print(deparse(sys.call())); 
} 

a %X% 3 + 1:10; 

Các kết quả mong muốn là "một% X% 3 + 1:10" Kết quả quan sát là "một% X% 3"

Cảm ơn.

+1

Odd; khi tôi chạy mã (R 2.15.1) tôi nhận được 'Lỗi trong một% X% 3 + 1:10: đối số phi số để toán tử nhị phân ' –

+0

@DavidRobinson, lỗi đến từ toán tử' + 'khi cố gắng tổng kết quả đầu ra của 'a% X% 3' của ký tự kiểu với' 1: 10' của kiểu số. – flodel

Trả lời

2

Tôi cho rằng không có cách nào để giảm mức độ ưu tiên của toán tử tùy chỉnh. Tuy nhiên, tôi nghĩ rằng tôi tìm thấy một workaround cheesy: tôi có thể đặt tên cho nhà điều hành của tôi<<-

Tôi không thực sự hiểu thế nào <- công trình cử, và phải có hàng chục các phương pháp đối tượng cụ thể khác nhau của <- (không ai trong số đó hiển thị trong methods( < -.. ) Tất cả tôi biết là khi tôi ghi đè <- tất cả các loại vi phạm thứ

Tuy nhiên, <<- có độ ưu tiên gần như của <-, và nó không phải là đặc biệt hữu ích bởi vì đối với các trường hợp thỉnh thoảng nơi bạn thực sự cần phải viết một biến toàn cầu từ bên trong một hàm hoặc một vòng lặp, bạn chỉ có thể sử dụng .GlobalEnv[['foo']] <- bar hoặc assign('foo',bar,env=.GlobalEnv).

Bên cạnh đó, vì tôi chỉ cố đăng nhập và ghi bảo vệ các đối tượng trong .GlobalEnv ở vị trí đầu tiên, ý nghĩa mới mà tôi đang gán cho <<- thậm chí còn hơi phù hợp với bản gốc.

6

Điều này phải liên quan đến quyền ưu tiên của nhà điều hành, xem ?Syntax để được trợ giúp thêm. Nó nói rằng các toán tử đặc biệt (%any%) giống như toán tử bạn đang định xác định có độ ưu tiên cao hơn nhị phân +, vì vậy không có cách nào khác (AFAIK) cho bạn hơn là dùng dấu ngoặc đơn và làm a %X% (b + c).

+0

Trong sự tò mò: thì làm thế nào '<-' /' = 'làm việc? Tôi lấy nó không phải là toán tử nhị phân –

+0

@DavidRobinson, '<-' và' = 'là toán tử nhị phân, với độ ưu tiên rất thấp, xem'? Cú pháp'. – flodel