2013-03-06 5 views
5

Ich möchte eine neue Objektklasse in R definieren, die mit eigenen Funktionen ausgestattet ist (z. B. Getter für maximalen Wert). Ist es möglich, dies in R zu realisieren? Ich dachte an so etwas wie:Ist es möglich, Objektklassen zu definieren, die eigene Methoden haben? R

test <- class() { 
    len = 0  # object variable1 

    __constructor(length=0) { 
    len = length # set len 
    } 

    getLength <- function() { 
    len # return len 
    } 
} 

und

ob = test(20) # create Objectof class test 
ob.getLength() # get Length-Value of Object 
+2

Vielleicht sollten Sie die "objektorientierte Programmierung" des devtools Wiki lesen: https: //github.com/hadley/devtools/wiki – juba

+4

R hat 'S3',' S4' und 'R5' Konzepte von OOPs. Sie müssen eine auswählen und dann Ihre eigenen Funktionen (S3) oder Methoden (S4, R5) definieren. Start [** hier **] (https://github.com/hadley/devtools/wiki/S3) – Arun

+0

... verwandt: http://stackoverflow.com/questions/9521651/r-und-objektorientiert -Programmierung –

Antwort

8

Um Ihnen den Einstieg, ich werde ein Beispiel mit S3 Klassen geben:

# create an S3 class using setClass: 
setClass("S3_class", representation("list")) 
# create an object of S3_class 
S3_obj <- new("S3_class", list(x=sample(10), y=sample(10))) 

Jetzt können Sie funk- Überlasten Sie interne Funktionen, zum Beispiel length Funktion zu Ihrer Klasse als (Sie können auch operator-overload):

length.S3_class <- function(x) sapply(x, length) 
# which allows you to do: 
length(S3_obj) 

# x y 
# 10 10 

Oder alternativ können Sie Ihre eigene Funktion mit beliebigen Namen haben, wo Sie können überprüfen, ob das Objekt der Klasse ist S3_class und etwas tun:

len <- function(x) { 
    if (class(x) != "S3_class") { 
     stop("object not of class S3_class") 
    } 
    sapply(x, length) 
} 

> len(S3_obj) 
# x y 
# 10 10 

> len(1:10) 
# Error in len(1:10) : object not of class S3_class 

Es ist ein bisschen schwer S4 zu erklären (wie S3), da es ziemlich viele Begriffe und Dinge gibt, die man kennen muss (sie sind nicht schwierig, nur anders). Ich schlage vor, Sie gehen durch die Links unter Kommentare für diese (und auch für S3, da mein Zweck hier war, Ihnen ein Beispiel zu zeigen, wie es gemacht wird).

6

R hat auch Funktion Verschlüsse, die ganz gut Ihr Beispiel passt

test = function() { 
    len = 0 
    set_length = function(l = 0) len <<-l 
    get_length = function() len 
    return(list(set_length=set_length, get_length=get_length)) 
} 

ergibt dies:

R> m = test() 
R> m$set_length(10) 
R> m$get_length() 
[1] 10 
R> m$set_length() 
R> m$get_length() 
[1] 0 
Verwandte Themen