2012-02-13 41 views
14

Chức năng hỗ trợ R có quá tải không ??R - Quá tải chức năng

tôi muốn làm điều gì đó trong dòng:

g <- function(X,Y) { # do something and return something } 
g <- function(X) { # do something and return something} 
+4

cung cấp. như đã thảo luận dưới đây), nhưng 'quá tải chức năng' có thể ám chỉ một cái gì đó hơn dọc theo các dòng của phương pháp R [hệ thống điều phối] (http://cran.at.r-project.org/doc/manuals/R-lang.html# Object_002doriented-programming) S3 và S4. – joran

+0

có, điều này có thể được thực hiện bởi các đối số tùy chọn nhưng tôi đang tìm một cái gì đó tương tự như định nghĩa chức năng Erlang :-) – MadSeb

+0

Đề xuất tốt, @joran. Bạn đánh bại tôi với nó * và * cung cấp liên kết thích hợp nhất. –

Trả lời

13

EDIT, sau làm rõ các câu hỏi trong ý kiến ​​trên:

Từ lướt qua this page, nó trông giống như Erlang cho phép bạn xác định chức năng mà sẽ cử các phương pháp hoàn toàn khác nhau tùy thuộc trên danh nghĩa của danh sách đối số của chúng (tối đa ..., sau đó các đối số là tùy chọn/không ảnh hưởng đến phương thức được gửi đi).

Để làm điều gì đó giống như vậy trong R, bạn có thể muốn sử dụng các lớp và phương thức S4. Trong hệ thống S3, phương thức được gửi đi chỉ phụ thuộc vào lớp của đối số đầu tiên. Trong hệ thống S4, phương thức được gọi có thể phụ thuộc vào các lớp của một số đối số tùy ý.

Để biết ví dụ về những gì có thể, hãy thử chạy các bước sau. Nó yêu cầu bạn phải cài đặt cả gói raster và gói sp. Giữa chúng, chúng cung cấp một số lượng lớn các chức năng để vẽ cả dữ liệu không gian và dữ liệu không gian vectơ, và cả hai đều sử dụng hệ thống S4 để thực hiện việc gửi phương thức. Mỗi dòng được trả về bởi lệnh gọi tới showMethods() tương ứng với một hàm riêng biệt, sẽ được gửi đi khi plot() được chuyển qua các đối số xy có các lớp được chỉ định (có thể bao gồm hoàn toàn "missing").

> library(raster) 
> showMethods("plot") 
Function: plot (package graphics) 
x="ANY", y="ANY" 
x="Extent", y="ANY" 
x="Raster", y="Raster" 
x="RasterLayer", y="missing" 
x="RasterStackBrick", y="ANY" 
x="Spatial", y="missing" 
x="SpatialGrid", y="missing" 
x="SpatialLines", y="missing" 
x="SpatialPoints", y="missing" 
x="SpatialPolygons", y="missing" 

R chắc chắn không. Hãy thử, ví dụ:

plot(x = 1:10) 
plot(x = 1:10, y = 10:1) 

Và sau đó hãy xem cách hàm thực hiện điều đó bằng cách nhập plot.default.

Nói chung, cách tốt nhất để tìm hiểu cách thực hiện loại điều này sẽ dành một chút thời gian để sử dụng để xác định các hàm có hành vi đã quen thuộc với bạn. Sau đó, nếu bạn muốn khám phá các hình thức xử lý phương thức phức tạp hơn, bạn sẽ muốn xem xét cả hệ thống lớp S3 và S4 do R.

8

này thường được thực hiện tốt nhất thông qua đối số tùy chọn. Ví dụ:

g <- function(X, Y=FALSE) { 
    if (Y == FALSE) { 
     # do something 
    } 
    else { 
     # do something else 
    } 
} 
+0

điều này có vẻ ok! tôi nghĩ rằng một cái gì đó như thế này thậm chí sẽ đẹp hơn: g <- function (X, FALSE) {# làm điều gì đó} g <- function (X, TRUE) {# làm điều gì đó} điều này giống như chức năng Erlang/Prologue định nghĩa/đối số phù hợp :-) bất kỳ ý tưởng nếu điều này có thể được thực hiện trong R? – MadSeb

+0

Mã bạn mô tả sẽ không hoạt động trong R. Những gì bạn đang tìm kiếm có thể là phương thức gửi, như được thảo luận bởi câu trả lời của @ JoshOBrien và yêu cầu một số nghiên cứu tùy thuộc vào chính xác những gì bạn muốn làm. –

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