Khám phá các chung để chúng ta biết những gì chúng ta đang hướng tới
> getGeneric("[")
standardGeneric for "[" defined from package "base"
function (x, i, j, ..., drop = TRUE)
standardGeneric("[", .Primitive("["))
<bytecode: 0x32e25c8>
<environment: 0x32d7a50>
Methods may be defined for arguments: x, i, j, drop
Use showMethods("[") for currently available ones.
Định nghĩa một lớp đơn giản
setClass("A", representation=representation(slt="numeric"))
và thực hiện một phương pháp
setMethod("[", c("A", "integer", "missing", "ANY"),
## we won't support subsetting on j; dispatching on 'drop' doesn't
## make sense (to me), so in rebellion we'll quietly ignore it.
function(x, i, j, ..., drop=TRUE)
{
## less clever: update slot, return instance
## [email protected] = [email protected][i]
## x
## clever: by default initialize is a copy constructor, too
initialize(x, [email protected][i])
})
Trong hành động:
> a = new("A", slt=1:5)
> a[3:1]
An object of class "A"
Slot "slt":
[1] 3 2 1
Có nhiều chiến lược khác nhau để hỗ trợ nhiều chữ ký (ngầm), ví dụ bạn có thể cũng muốn hỗ trợ các giá trị chỉ mục ký tự và logic, có thể cho cả i và j. Hướng thẳng đứng nhất là một mẫu "mặt tiền", trong đó mỗi phương pháp thực hiện một số áp lực sơ bộ đối với một loại chỉ mục con chung, ví dụ, integer
để cho phép sắp xếp lại và lặp lại các mục chỉ mục, sau đó sử dụng callGeneric
để gọi một phương thức duy nhất điều đó làm công việc của lớp học.
Không có sự khác biệt về khái niệm cho [[
, ngoài việc muốn tôn trọng ngữ nghĩa trả về nội dung thay vì một thể hiện khác của đối tượng như được ngụ ý bởi [
. Đối với $
chúng tôi có
> getGeneric("$")
standardGeneric for "$" defined from package "base"
function (x, name)
standardGeneric("$", .Primitive("$"))
<bytecode: 0x31fce40>
<environment: 0x31f12b8>
Methods may be defined for arguments: x
Use showMethods("$") for currently available ones.
và
setMethod("$", "A",
function(x, name)
{
## 'name' is a character(1)
slot(x, name)
})
với
> a$slt
[1] 1 2 3 4 5
Cảm ơn Martin! Điều này thực sự hữu ích (đến mức mà tôi vi phạm quy tắc "không để lại lời cảm ơn vì nó là tiếng ồn" :-) –