戏说R语言系列10

我问过两位以前的同事,如果我想学python,要怎么学?一位说,编程语言相通的地方很多,如果有一些其他语言的基础,比较着去学,会容易一些,还有一本很厚的《python学习手册》,也值得看一下。另一位说,廖雪峰的博客不错,可以参考。

其中一位同事大学期间被交换到瑞典,呆了五年。

有一次,我问他:你十几岁就开始写游戏程序,在国外是不是很厉害?

他说:不是的,那些德国程序员都是祖传的,几岁就开始写了。

另外一位同事,属于野生程序员,一个人可以搞定很多事情,就是一回头把事情搞定的那种程序员。

我最近也在学R语言的面向对象编程。顺便落实一下两位前同事的建议。

这里参考了张丹老师的R语言基于R6的面向对象编程廖雪峰Python面向对象高级编程。当然还有那本《Python学习手册》。

两种语言一起学,并不是一件容易的事情。首先,得有一个比较合适的学习环境。有些书上提到,初学者不要在IDE上学习编程语言,那是学不会的。不过,这事儿好像也没那么绝对。

这里推荐使用Rmarkdown工具。这个工具是谢益辉大神的得意之作。有点类似 Python的 Jupyter Notebook,我用 R用的比较多, 对Rmarkdown熟悉一些。

Jupyter Notebook跨语言使用还是要做一些配置工作,这个有点烦。Rmarkdown会好很多,只要安装Rstudio即可。

我的学习环境如下图所示,我用的是 Rstudio-server,这是一个服务器版本的Rstudio,在浏览器里就可以直接使用R语言。服务器版本的好处就是可以拉上几个人协同开发,只要服务器的资源充裕,再也不用要求程序员开发机必须4G内存了,现在内存是真贵啊!我想换电脑,都只能从二手的找起,各位如果有好的二手资源,帮助提供一下信息。

Rstudio-server长成这样

这张图里可见,我们可以新建很多类型的东西。我最常用的是R Script,然后是Rmarkdown。上周同学聚会的时候,同学特意问我用的是不是脚本语言,我解释地有点心虚,不过《Python学习手册》也有那么一节讨论“Python算不算脚本语言呢”,作者说“这取决你问的标准”。所以,把标准放低的话,R语言也算是一门脚本语言。

R语言也可以开发web应用,其中Rstudio公司提供的工具是Shiny。我用的不太好,设计的界面稍微丑了点,速度慢一些(怎么也不能和谷歌的V8比啊),但交互性还蛮好,用了一些图表工具,像echarts、plotly。我个人还是喜欢plotly多一点点,提供了R语言的接口,这样我就不用学JavaScript了,但是我觉着JavaSript还是要学一点的,如果想做一个强壮web应用的话。

再就是 “ C++ File ” ,由于Rcpp工具的出现,越来越多的R语言应用底层其实都是C++,这对提升运行速度、降低资源消耗是很有利的。

用Rstudio-server,还有另外一层意思,就是linux的Rstudio桌面版并不支持中文。这个蛋疼的事情,引发了中土大唐人士的极大不满,纷纷要求谢益辉大神向Rstudio公司提出抗议。谢大神无奈地说:“作为Rstudio公司唯一的华人工程师,实在是太微弱的声音了”。没办法,我只好安装Rstudio-server了,浏览器对中文的支持还是杠杠的。

我们再看一下Rmarkdown是如何同时使用Python和R语言的。如下图所示。

在同一个学习环境,我们可以同时学习各种语言

R代码用Rmarkdown的语法嵌入,即三个反引号开始一段代码```{r}和三个反引号``` 结束一段代码。

类似的,Python代码用Rmarkdown的语法嵌入,也是三个反引号开始一段代码```{python}和三个反引号``` 结束一段代码。

我们还可以嵌入bash和Python3,甚至数据库等等。

好了,我们回到R语言发展面向对象编程的主题。

R语言发展面向对象编程的过程比较曲折。从S3、S4、RC一路发展过来,到现在的R6。用Hadley Wickham的话就是,R6终于和Python、ruby、Java这些面向对象语言有点像了。

这里把张丹老师的R语言博客和廖雪峰老师的Python博客中相似的部分,拿出来学习一下。

张丹老师在R6类的主动绑定里这样讲:“主动绑定(Active bindings)是R6中一种特殊的函数调用方式,把对函数的访问表现为对属性的访问”。

廖雪峰老师在使用@property里这样讲:“还记得装饰器(decorator)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置的@property装饰器就是负责把一个方法变成属性调用的”。

这么说,R语言的主动绑定和Python的使用@property,有些相似。

我们看一下张丹老师举的例子。

代码来自张丹老师博客

使用主动绑定之后,函数既可以像一个方法,也可以像一个属性。这个是很便利的。

如果使用Python的@property装饰器,根据张丹老师这段R代码,改写成Python代码如下:

使用@property装饰器

如果仔细观察的话,R的主动绑定和Python的@property装饰器还是有一些差异的。特别是 'active' 传参那一块。代码看起来很像,实际用起来还是不一样的。

张丹老师在实例化对象的存储里这样讲:“实例化对象的存储还有另外一方面的考虑,由于类中的变量都是存在于一个环境空间中的,我们也可以通过手动的方式找到这个环境空间,从而进行变量的增加或修改。 如果随意地对环境空间中的变量进行修改,那么会给我们的程序带来一些安全上的风险,所以为了预防安全上的问题,可以通过R6Class()的lock参数所定环境空间,不允许动态修改,默认值为锁定状态不能修改。”

张丹老师提供了下面这个例子。'lock = TRUE'锁定后,就不可以对实例添加新的变量(属性)了。

代码来自张丹老师博客

廖雪峰老师在使用__ slots__里这样讲:“如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性......为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__ slots__变量,来限制该class实例能添加的属性”。

用__ slots__ 改写上面这个例子,如下图所示:

使用__ slots__后无法添加新的属性

张丹老师描述了R6类的对象的静态属性“用面向对象的方法进行编程,那么所有变量其实都是对象,我们可以把一个实例化的对象定义成另一个类的属性,这样就形成了对象的引用关系链。。。当属性赋值为另一个R6的对象时,属性的值保存了对象的引用,而非对象实例本身。利用这个规则就可以实现对象的静态属性,也就是可以在多种不同的实例中是共享对象属性,类似于Java中的static属性一样。

张丹老师举了下面一个例子。

代码来自张丹老师博客

我在廖雪峰老师的博客里找了半天,并没有找到对应的对象的静态属性,但试着写了下面这段代码,发现python也有对象的静态属性。

python对象的静态属性

廖雪峰老师在类和实例一节中提到“类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响”。如果考虑到对象的静态属性,各个实例之间可以共享相同的属性,修改其中一个实例的属性,也会影响其他实例的属性。所以“各个实例拥有的数据都互相独立,互不影响”这一结论是不太严谨的。

小结一下:

  • Rmarkdown可以提供同时学习多种编程语言的环境,通过比较学习,可以加深理解。

  • 这里提到的R语言和python语言在面向对象编程方面存在一些相通的地方,讲的有点浅,没有举更多例子。

表姐有次问我:你都这么大了,怎么还学啊?

不学不行啊,我没有张仪的三寸不烂之舌,只能不停的敲打自己的饭碗,所谓笨手笨脚的饭碗,就是指这个吧,辛苦是肯定的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 工欲善其事,必先利其器。总结一下,方便多了。R语言还是很牛逼的,可以干很多事情。有一把顺手的刀还是很重要的。 0....
    Liam_ml阅读 4,600评论 1 60
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,205评论 4 16
  • 今天的语文课上几个关于拼音的小故事。第一个是声母zcs的故事:有一个门,里面有个穿紫色衣服的蚕宝宝在吐丝,门下面还...
    荆玉淋阅读 335评论 0 0
  • 本篇文章将帮助你—— ◎ 了解认知意志力,意志力的重要性 ◎科学系统地进行自我掌控,轻松提升自己工作效率 ◎改掉明...
    玩命飞哥阅读 232评论 0 0