2011-07-05 30 views
90

Vì tôi khá mới đối với R, tôi không biết phương pháp và đối tượng S3 là gì. Tôi thấy rằng có hệ thống đối tượng S3 và S4 và một số đề xuất sử dụng S3 trên S4 nếu có thể (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html). Tuy nhiên, tôi không biết định nghĩa chính xác của các phương thức/đối tượng S3."Phương pháp S3" có nghĩa là gì trong R?

Trả lời

65

Hầu hết các thông tin liên quan có thể được tìm thấy bằng cách nhìn vào ?S3 hoặc ?UseMethod, nhưng trong một nutshell:

S3 đề cập đến một chương trình của phương pháp điều phối. Nếu bạn đã sử dụng R trong một thời gian, bạn sẽ nhận thấy rằng có các phương thức print, predictsummary cho rất nhiều loại đối tượng khác nhau.

Trong S3, điều này hoạt động bằng cách:

  • thiết lập các lớp của các đối tượng của quan tâm (ví dụ: giá trị trả về của một cuộc gọi phương pháp glm có lớp glm)
  • cung cấp một phương pháp với tên chung của (ví dụ: print), sau đó là một dấu chấm và thì tên lớp (ví dụ: print.glm)
  • một số việc chuẩn bị phải là thực hiện để tên chung này (print) để làm việc này, nhưng nếu bạn chỉ đơn giản là tìm cách để phù hợp với mình để tên phương pháp hiện tại, bạn không cần này (xem trợ giúp tôi giới thiệu đến sớm hơn nếu bạn làm).

Để con mắt của người theo dõi, và đặc biệt, người dùng của gói phù hợp mô hình funky mới được tạo, sẽ thuận tiện hơn nếu bạn có thể nhập predict(myfit, type="class") hơn predict.mykindoffit(myfit, type="class").

Có thêm một chút nữa, nhưng điều này sẽ giúp bạn bắt đầu. Có một vài nhược điểm đối với phương pháp điều phối này dựa trên một thuộc tính (class) của các đối tượng (và C purists có thể nằm tỉnh táo vào ban đêm trong kinh dị), nhưng đối với rất nhiều tình huống, nó hoạt động một cách decently. Với phiên bản hiện tại của R, các cách mới hơn đã được triển khai (S4 và các lớp tham chiếu), nhưng hầu hết mọi người vẫn (chỉ) sử dụng S3.

37

Để giúp bạn bắt đầu với S3, hãy xem mã cho hàm median. Nhập median tại dấu nhắc lệnh cho thấy rằng nó có một dòng trong phần thân của nó, cụ thể là

UseMethod("median") 

Điều đó có nghĩa rằng đó là phương pháp S3. Nói cách khác, bạn có thể có một hàm khác nhau median cho các lớp S3 khác nhau. Để liệt kê tất cả các phương pháp trung bình có thể, hãy nhập

methods(median) #actually not that interesting. 

Trong trường hợp này, chỉ có một phương pháp, mặc định, được gọi cho bất kỳ thứ gì. Bạn có thể xem mã cho điều đó bằng cách nhập

median.default 

Một ví dụ thú vị hơn là hàm print, có nhiều phương pháp khác nhau.

methods(print) #very exciting 

Lưu ý rằng một số phương pháp có * bên cạnh tên của chúng. Điều đó có nghĩa rằng chúng được ẩn bên trong không gian tên của một số gói. Sử dụng find để tìm ra gói họ đang ở. Ví dụ

find("acf") #it's in the stats package 
stats:::print.acf 
6

Hãy thử

methods(residuals) 

trong đó liệt kê, trong số những người khác, "residuals.lm" và "residuals.glm". Điều này có nghĩa là khi bạn đã trang bị một mô hình tuyến tính, m và loại residuals(m), residuals.lm sẽ được gọi. Khi bạn đã trang bị mô hình tuyến tính tổng quát, số dư sẽ được gọi. Kiểu mô hình đối tượng C++ bị đảo ngược. Trong C++, bạn định nghĩa một lớp cơ sở có các hàm ảo, được ghi đè bởi dẫn xuất được phân loại. Trong R bạn định nghĩa một hàm ảo (hay còn gọi là generic) và sau đó bạn quyết định lớp nào sẽ ghi đè hàm này (còn gọi là định nghĩa một phương thức). Lưu ý rằng các lớp làm việc này không cần phải được bắt nguồn từ một lớp siêu phổ biến. Tôi sẽ không đồng ý nói chung thích S3 hơn S4. S4 có nhiều hình thức (= nhập nhiều hơn) và điều này có thể là quá nhiều đối với một số ứng dụng. Tuy nhiên, các lớp S4 có thể được định nghĩa như một lớp hoặc cấu trúc trong C++. Bạn có thể chỉ định rằng đối tượng của một lớp nhất định được tạo thành từ một chuỗi và hai số ví dụ:

setClass("myClass", representation(label = "character", x = "numeric", y = "numeric")) 

Phương thức được gọi với đối tượng của lớp đó có thể dựa vào đối tượng có các thành viên đó. Điều đó rất khác với các lớp S3, đây chỉ là một danh sách của một loạt các phần tử.

Với S3 và S4, bạn gọi hàm thành viên theo số fun(object, args) và không phải bằng object$fun(args). Nếu bạn đang tìm kiếm một cái gì đó như sau này, hãy xem gói proto.

+0

Tôi khá chắc chắn rằng ý tưởng về chức năng và phương pháp thuộc đối tượng thành viên không làm cho rằng có rất nhiều ý nghĩa trong R. Phương pháp không thuộc đối tượng (cũng có chức năng là các đối tượng quá) nhưng thuộc về chức năng. – petermeissner

+0

[xem tại đây] (http://adv-r.had.co.nz/OO-essentials.html#s3) – petermeissner

10

Tôi đến câu hỏi này phần lớn tự hỏi tên của bạn đến từ đâu. Nó xuất hiện từ this wikipedia article rằng tên đề cập đến phiên bản của Ngôn ngữ lập trình S mà R được dựa trên. Phương thức điều phối phương pháp được mô tả trong các câu trả lời khác đến từ S và được gắn nhãn phù hợp theo phiên bản.

27

Từ http://adv-r.had.co.nz/OO-essentials.html:

ba hệ thống OO R khác nhau về cách thức các lớp học và phương pháp được định nghĩa:

  • S3 thực hiện một phong cách lập trình OO gọi chung chức năng OO. Điều này khác với hầu hết các ngôn ngữ lập trình, như Java, C++ và C#, thực hiện OO truyền tin nhắn. Khi gửi tin nhắn, các tin nhắn (các phương thức) được gửi đến các đối tượng và đối tượng xác định chức năng nào để gọi. Thông thường, đối tượng này có giao diện đặc biệt trong phương thức gọi , thường xuất hiện trước tên của phương thức/thông báo: ví dụ: canvas.drawRect ("màu xanh"). S3 là khác nhau. Trong khi tính toán vẫn là được thực hiện thông qua các phương pháp, một loại chức năng đặc biệt được gọi là hàm chung sẽ quyết định phương thức nào cần gọi, ví dụ: drawRect (canvas, "blue"). S3 là một hệ thống rất bình thường. Nó không có định nghĩa chính thức về các lớp.

  • S4 hoạt động tương tự như S3, nhưng chính thức hơn. Có hai sự khác biệt lớn đối với S3 là .S4 có các định nghĩa lớp học chính thức, mô tả biểu diễn và thừa kế cho mỗi lớp và có các hàm đặc biệt trợ giúp để xác định các generics và phương thức. S4 cũng có nhiều công văn , có nghĩa là các hàm chung có thể chọn các phương thức dựa trên lớp của bất kỳ số đối số nào, không chỉ một đối số.

  • Các lớp tham chiếu, gọi tắt là RC, khá khác so với S3 và S4. RC triển khai OO truyền tin, vì vậy các phương thức thuộc về các lớp , không phải chức năng. $ được sử dụng để tách các đối tượng và phương thức, do đó, các cuộc gọi phương thức trông giống như canvas $ drawRect ("màu xanh"). Đối tượng RC cũng có thể là có thể thay đổi: chúng không sử dụng ngữ nghĩa thông thường về sửa đổi sao chép của R, nhưng là được sửa đổi tại chỗ. Điều này khiến chúng khó hơn, nhưng cho phép chúng giải quyết các vấn đề khó giải quyết với S3 hoặc S4.

Ngoài ra còn có một hệ thống khác mà không phải là khá OO, nhưng điều quan trọng là đề cập đến ở đây:

  • loại cơ sở, các loại C cấp nội làm nền tảng cho các OO khác hệ thống. Các loại cơ sở chủ yếu được điều khiển bằng mã C, nhưng chúng quan trọng là phải biết về vì chúng cung cấp các khối xây dựng cho các hệ thống OO khác.
Các vấn đề liên quan