2013-03-06 6 views
5

Vorrei definire una nuova classe di oggetti in R che viene fornita con la propria funzionalità (ad es. Getter per il valore massimo). È possibile realizzare questo in R? Stavo pensando a qualcosa di simile:E 'possibile definire classi di oggetti che hanno metodi propri in R

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

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

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

e

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

Forse si dovrebbe leggere la sezione "programmazione orientata agli oggetti" del DevTools wiki: https: //github.com/hadley/devtools/wiki – juba

+4

R ha i concetti di 'S3',' S4' an' R5' di OOP. Dovrai sceglierne uno e poi definire le tue funzioni (S3) o metodi (S4, R5). Inizia [** qui **] (https://github.com/hadley/devtools/wiki/S3) – Arun

+0

... correlati: http://stackoverflow.com/questions/9521651/r-and-object-oriented -programmazione –

risposta

8

Per iniziare, ti darò un esempio con S3 classi:

# 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))) 

Ora, è possibile FUNCTION- sovraccaricare le funzioni interne, ad esempio, la funzione length come classe (è possibile anche operator-overload):

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

# x y 
# 10 10 

Oppure, in alternativa, si può avere la propria funzione, con qualsiasi nome, in cui è possibile controllare se l'oggetto è di classe S3_class e fare qualcosa:

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 

E 'un po' difficile da spiegare S4 (come S3) perché ci sono un bel po 'di termini e cose da sapere (non sono difficili, solo diversi). Ti suggerisco di passare attraverso i collegamenti forniti sotto i commenti per quelli (e anche per S3, dato che il mio scopo qui era di mostrarti un esempio di come è fatto).

6

R ha anche chiusure di funzione, che si inserisce il vostro esempio abbastanza bene

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)) 
} 

questo dà:

R> m = test() 
R> m$set_length(10) 
R> m$get_length() 
[1] 10 
R> m$set_length() 
R> m$get_length() 
[1] 0 
Problemi correlati