2016-06-02 21 views
6

Xin lỗi cho tiêu đề, không chắc chắn cách khác để cụm từ câu hỏi này.R S4 setMethod '[' phân biệt đối số còn thiếu?

Nếu tôi muốn tạo setMethod trên một lớp học, làm cách nào để phân biệt giữa các trường hợp tương tự mat[i,]mat[i]?

tôi biết cựu Tôi có thể sử dụng:

setMethod("[", 
    signature(x = "foo", j = "missing", drop = "missing"), 
    function(x,i,j,drop) return(myFunc(x,i)) 
) 

Làm thế nào tôi có thể thiết lập một phương pháp để phân biệt sau này, nơi tôi sẽ không muốn để chọn hàng nhưng các yếu tố như trong lớp basematrix?

Nhìn vào các tài liệu ?[ tôi mong đợi một cái gì đó như sau sẽ làm việc:

setMethod("[", 
    signature(x = "foo", i = "numeric"), 
    function(x,i,j,drop) return(myFunc(x,i)) 
) 

nhưng nó xung đột với bất kỳ phương pháp xác định trước đó nơi jdrop đang thiếu.

Ý tưởng là giống như

mat <- matrix(seq(9), 3, 3) 

mat[c(1,3),] 
1 4 7 
3 6 9 

mat[c(1,3)] 
[1] 1 3 

Trả lời

3

Bạn sẽ tìm thấy rất nhiều ví dụ trong các gói Matrix. Nó sử dụng S4 và thực hiện các lớp và phương pháp mới cho ma trận. Theo như tôi biết không có cách nào để khai báo những gì bạn đang tìm kiếm trong chữ ký. Thay vào đó, bạn phải sử dụng hàm nargs để phân biệt giữa mat[1]mat[1, ]. Dưới đây là một ví dụ làm thế nào để làm điều đó:

setClass("foo", slot = c(mat = "matrix")) 

setMethod(
    "[", 
    signature(x = "foo", i = "missing", j = "missing", drop = "missing"), 
    function(x, i, j, drop = FALSE) { 
    x 
    } 
) 

setMethod(
    "[", 
    signature(x = "foo", i = "numeric", j = "missing", drop = "missing"), 
    function(x, i, j, ..., drop) { 
    if (nargs() == 3) [email protected][i, ] 
    else [email protected][i] 
    } 
) 

setMethod(
    "[", 
    signature(x = "foo", i = "numeric", j = "numeric", drop = "missing"), 
    function(x, i, j, ..., drop) { 
    [email protected][i, j] 
    } 
) 

mat <- new("foo", mat = matrix(seq(9), 3, 3)) 

mat[] 
mat[2:5] 
mat[1:2, ] 
mat[1:2, 2] 

Tuy nhiên, nó sẽ dễ dàng hơn nếu bạn trực tiếp mở rộng các lớp cơ sở 'ma trận' (hoặc 'Ma trận' từ gói Matrix) và làm điều gì đó như

setClass("Matrix", contains = "matrix") 

vì bạn nhận các phương pháp này miễn phí. Lưu ý ví dụ, rằng trong việc thực hiện ở trên, bạn vẫn phải chăm sóc đối số drop. Và về cơ bản bạn phải thực hiện lại những gì đã có.

+0

Điều đó dường như thực hiện thủ thuật – cdeterman

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