2012-11-02 37 views
17

Trong nhiệm vụ liên tục của tôi để tránh sử dụng dấu ngoặc đơn cho một số lệnh đơn giản, tôi đã viết lên toán tử sau đây để tạo một cửa sổ đồ họa mới. Câu hỏi của tôi là: tôi có nguy cơ "phá vỡ" bất cứ điều gì trong R, khác hơn là không có khả năng rõ ràng để thực hiện chức năng "không" trên biến "newdev" ​​của tôi?R quá tải nhà điều hành đơn nhất: rủi ro?

# function to overload "!" for one purpose only 
#this is adapted from the sos package code for "???", credited to Duncan Murdoch. 
# Example of how to create a specialized unary operator that doesn't require 
# parentheses for its argument. So far as I can tell, 
#the only way to do this is to overload an existing function or 
# operator which doesn't require parentheses. "?" and "!" meet this requirement. 
`!` <- function (e1, e2) { 
call <- match.call() 
# match.call breaks out each callable function in argument list (which was "??foo" for the sos package "???", 
# which allows topicExpr1 to become a list variable w/ callable function "!" (or "?" in sos) 
original <- function() { 
    call[[1]]<-quote(base::`!`) 
    return(eval(call, parent.frame(2))) 
} 

    # this does preclude my ever having an actual 
    # variable called "newdev" (or at least trying to create the actual NOT of it) 
if(call[[2]] =='newdev') { 
    windows(4.5,4.5,restoreConsole=T) 
}else{ 
    return(original()) # do what "!" is supposed to do 
} 
} 
+0

Bạn chỉ cần sử dụng các lệnh đơn giản này trực tiếp tại dấu nhắc lệnh (tức là không nhúng chúng vào các hàm hoặc không có gì)? Nếu có, bạn có thể tạo một lớp mới và xác định phương thức in cho lớp đó sẽ làm những gì bạn muốn. – BenBarnes

+0

Tôi nghĩ rằng có một cơ hội tốt để tôi gọi những lệnh này bên trong một hàm, nếu tôi muốn tạo một bộ sưu tập các biểu đồ, ví dụ: –

Trả lời

4

Tôi đã thực hiện "!" = function(a){stop("'NOT' is used")} và thực hiện chức năng replications, sử dụng! nhà điều hành, và điều này làm việc tốt. Vì vậy, có vẻ như nó là an toàn để ghi đè lên "!".

Tuy nhiên bạn có thể muốn sử dụng các lớp học, mà bạn có thể làm như sau:

# Create your object and set the class 
A = 42 
class(A) = c("my_class") 

# override ! for my_class 
"!.my_class" = function(v){ 
    cat("Do wathever you want here. Argument =",v,"\n") 
} 

# Test ! on A 
!A 
+0

Điểm tốt, mặc dù điều này sẽ không làm việc cho mục đích dự định của tôi, đó là để thực hiện một đóng cửa cụ thể mà không đòi hỏi một đối số mà không cần phải gõ "()" sau nó. Ví dụ, '! Ls' thay vì' ls() '. Và, vâng, tôi lười như vậy :-). (hãy nhớ, hành vi mặc định trong 'R' nếu bạn chỉ nhập tên của một đóng là in mã đóng cửa vào bảng điều khiển) –

+3

Để thêm vào điều này: các hàm được định nghĩa tương tác hoặc trong' .Rprofile' của bạn đi trong 'globalenv () '- Hàm trong các gói không thể thấy chúng. Tuy nhiên, mọi chức năng * khác * mà bạn có thể có trong '.RProfile' của bạn sẽ bị ảnh hưởng. – Owen

1

với

makeActiveBinding 

bạn có thể thay ls() bằng cách ví dụ như LS w/o nhu cầu của các nhà khai thác unary

+0

Đó là một điểm tốt, và trên thực tế, tôi sử dụng một vài chức năng "quickie". Tôi vừa mới kết thúc việc ưa thích phương thức được đăng bởi vì tôi viết lại nó với một hàm 'switch' - xem mã nguồn cho' splatnd' trong gói 'cgwtools'. –

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