2015-01-13 28 views
13

Nếu tôi muốn kiểm tra xem biến có được kế thừa từ một số lớp hay không, tôi có thể sử dụng is hoặc inherits.Sự khác nhau giữa là gì và thừa kế?

class(letters) 
## [1] "character" 
is(letters, "character") 
## [1] TRUE 
inherits(letters, "character") 
## [1] TRUE 

Có tùy chọn nào tôi nên sử dụng không và liệu chúng có bao giờ trả về các giá trị khác nhau không?

+0

Bạn chắc chắn bạn không muốn thẻ 'r-faq' trên thẻ này? –

Trả lời

9

Phiên bản ngắn:

Sử dụng inherits, nhưng hãy cẩn thận với số và lớp S4. phiên bản


dài:

Từ phần See Also của trang is giúp đỡ:

kế thừa gần như luôn luôn tương đương với là, cả hai cho S4 và phi S4 đối tượng, và là hơi nhanh hơn. Không tương đương áp dụng cho các lớp học có các lớp siêu có điều kiện, với một thử nghiệm không tầm thường = trong mối quan hệ (không phổ biến và không khuyến khích): đối với các thử nghiệm này là mối quan hệ nhưng kế thừa theo định nghĩa bỏ qua điều kiện thừa kế có điều kiện cho S4 các đối tượng.

Từ phần Lớp học chính thức của trang inherits giúp đỡ:

Các chất tương tự của kế thừa cho các lớp học chính thức là được. Hai hàm hoạt động nhất quán với một ngoại lệ: các lớp S4 có thể có thừa kế có điều kiện , với một thử nghiệm rõ ràng. Trong trường hợp này, sẽ là kiểm tra điều kiện, nhưng thừa hưởng bỏ qua tất cả các lớp siêu hạng có điều kiện.

Vì vậy, chúng chủ yếu trả về cùng một điều, nhưng inherits nhanh hơn, do đó, nó phải là lựa chọn mặc định trong hầu hết các trường hợp. (Như đã đề cập bởi Konrad, is cũng yêu cầu các gói methods được nạp, có thể làm cho nó không phù hợp với mục đích sử dụng nhạy cảm thực hiện Rscript.)

Các giá trị có thể khác nhau nếu bạn đang sử dụng các lớp học với thừa kế có điều kiện S4, nhưng đây là not recommended (xem phần "Phương pháp lựa chọn và công văn: Chi tiết"), điều đó có nghĩa là hy vọng là hiếm.

Nơi rõ ràng nhất khi hai hàm khác nhau là khi kiểm tra xem số nguyên có phải là số hay không.

class(1L) 
## [1] "integer" 
is.numeric(1L) 
## [1] TRUE 
is(1L, "numeric") 
## [1] TRUE 
inherits(1L, "numeric") 
## [1] FALSE 
+0

OK, vì vậy bạn có thể giải thích ** tại sao ** số nguyên không "kế thừa", trong khi phao thực hiện: Rgames> class (1.4) [1] "số" Rgames> is.numeric (1.4) [1] TRUE Rgames> kế thừa (1,4, 'số') [1] TRUE Rgames> là (1,4, 'số') [1] TRUE –

+2

Tôi nghĩ điều này có thể liên quan đến thực tế là các đối tượng số có * ẩn * class only: from '? class',' Nếu đối tượng không có thuộc tính class, nó có một lớp ngầm, '"matrix"', '"array"' hoặc kết quả của 'mode (x)' (ngoại trừ các vectơ số nguyên đã ẩn lớp '' số nguyên '') 'Tôi có thể tưởng tượng (??) rằng 'là' nhìn vào các lớp ngầm và' kế thừa' không ...? –

+0

Tôi nhớ đã nghe lỏm được một nhận xét về các chủ đề R cao cấp gọi đây là "sự cực kỳ". –

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