最近在学习R语言,然后有一些想法。

R语言与面向对象

R语言是一门开源的数据统计语言吧,感觉上跟MatLab是一样的存在。学习它的初衷也是取代MatLab,因为在Mac OS10.10中还不知道怎么安装MatLab,而Octave等等也表现不是很让人满意,R语言在Mac上的IDE听说出奇的好用,于是决定学学它,倒是有不少收获。

而至于面向对象,就不多说了。因为初学R语言,不知道R有没有提供面向对象的实现方法,但是在看Coursera上JHU的R Programming的课程感觉有一种比较简单的实现面向对象的方式。

实现方式

现在对于R的了解,仅仅停留在函数上,因此想到的这种实现方式也是用函数来实现。其实想法很简单,看代码就可以一目了然~

MyClass <- function(var){
	private.var <- var
	addOne <- function(){
		private.var <<- private.var + 1
	}
	printVar <- function(){
		private.var
	}
	list(printVar = printVar, addOne = addOne)
}

以上代码把对一个变量var的自增和打印封装成了一个类MyClass,类有两个函数,一个是addOne(),一个是printVar(),其中比较有趣的地方在于其返回值上,我是把两个函数作为参数,添加到一个list中,然后返回这个list。

其实相当于调用MyClass函数时,得到的参数是一个函数列表,有了这样一个列表,就可以访问MyClass中所有的方法了。当然如果有私有方法,可以不放入list中。

下面是一个用例~

> myc <- MyClass(1)
> myc$printVar()
[1] 1
> myc$addOne()
> myc$printVar()
[1] 2

不过这样做肯定也是有局限性的,比如如何继承,如何多态。这样只能实现最简单的面向对象的思想吧。。。

想法来自rprog in coursera的课程作业二。

继承与多态

在参考了下面评论中h的发言后,想到了实现继承与多态的方式。

Shape <- function(){
    isShape <- function(){
        "No Shape"
    }
    getArea <- function(){
        "No Shape"
    }
    list(getArea = getArea, isShape = isShape)
}

Triangle <- function(a, b, c){
    superClass <- Shape()
    private.a <- a
    private.b <- b
    private.c <- c
    superClass$isShape <- function(){
        if (a + b > c & a + c > b & b + c > a)
            "Yes, it is a triangle."
        else
            "No, sorry."
    }
    
    superClass$getArea <- function(){
        p <- (private.a + private.b + private.c) / 2
        area <- sqrt(p * (p - a) * (p - b) * (p - c))
        area
    }
    
    getA <- function() {private.a}
    superClass$getA <- getA
    superClass
}

嗯就是这样,修改函数列表中的内容可以实现多态,添加新的函数进列表可以实现继承的思想,机智。下面是一个用例~

> shape <- Shape()
> shape$isShape()
[1] "No Shape"
> tri <- Triangle(3,4,5)
> tri$isShape()
[1] "Yes, it is a triangle."
> tri$getArea()
[1] 6
> tri$getA()
[1] 3

PS:看上去highlight.js不太支持R语言啊~

评论