2013-03-06 5 views
5

独自の機能(例えば最大値のゲッター)が付いたRに新しいオブジェクトクラスを定義したいと思います。 Rでこれを実現することは可能ですか?私のようなものを考えていた:あなたが始めるために独自のメソッドを持つオブジェクトクラスを定義することは可能ですか?R

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

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

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

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

たぶん、あなたはデベロッパーツールのwikiの「オブジェクト指向プログラミング」セクションをお読みください: //github.com/hadley/devtools/wiki – juba

+4

Rには、OOPの「S3」、「S4」、「R5」という概念があります。 1つを選択してから、独自の関数(S3)またはメソッド(S4、R5)を定義する必要があります。 [**ここをクリック**](https://github.com/hadley/devtools/wiki/S3) – Arun

+0

...関連:http://stackoverflow.com/questions/9521651/r-and-object-oriented -プログラミング –

答えて

8

、私はS3クラスで例をあげる:今

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

を、あなたは機能 - ことができます例えば、lengthがあなたのクラスに関数としてオーバーロードされます(​​でも可能です):

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

# x y 
# 10 10 

または代わりに、あなたは、オブジェクトがクラスS3_classであるかどうかを確認し、何かを行うことができます任意の名前、使用して独自の機能を持つことができます。

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 

のような(S4を説明するために少し難しいですS3)はかなりの用語と知っていることがある(彼らは難しくない、ちょっと違う)。私はあなたがそれらのコメントの下で提供されたリンクを通過することをお勧めします(そして私の目的はここにあなたがそれがどのように行われたかの例を示すことでした)。

6

Rはまた、非常にうまくあなたの例をフィット関数クロージャを、持っている

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

この与えます。https:

R> m = test() 
R> m$set_length(10) 
R> m$get_length() 
[1] 10 
R> m$set_length() 
R> m$get_length() 
[1] 0 
関連する問題