R的交互与脚本模式

栏目: R语言 · 发布时间: 5年前

内容简介:抛出一个话题,R是不是有个大坑,在自动化脚本中(或者在循环中),某些脚本执行会不出结果,特别是作图脚本。ps:分步执行可以出图其实看我公众号的各位读者们,你们不应该有这个问题,如果有,那么证明我的文章没有好好看!有两篇很重要的文章《

抛出一个话题,R是不是有个大坑,在自动化脚本中(或者在循环中),某些脚本执行会不出结果,特别是作图脚本。ps:分步执行可以出图

其实看我公众号的各位读者们,你们不应该有这个问题,如果有,那么证明我的文章没有好好看!

有两篇很重要的文章《 扪心自问,meme几何? 》和《 树变图,图变树? 》,特别是第二篇,和这个问题息息相关。

首先假设我们有一个图:

require(ggplot2)
p = qplot(1:10)

为什么在终端打p可以出图?

因为在R里,所有都是 对象 ,而在终端里你输入一个对象回车,R会去找相应的 方法 去打印出来,如果是 S3 对象,会去寻找 print 方法,而如果是 S4 会去找 show 方法。

所以你在终端里打 p ,其实等同于你打 print(p) ,它其实调用了 ggplot2:::print.ggplot

你打 plot(p) 也可以,如果你看过代码的话,画图这个动作是定义在 plot.ggplot 方法里的,而 print.ggplot <- plot.ggplot

为什么在循环里就不行?

很多人认为这是 ggplot2 的问题,而且这也是一个FAQ了,我也遇到好多人问我,其实这不是 ggplot2 的问题,如果你认为是 ggplot2 的问题,你看到的只是皮毛。

我上面已经说了,是面向对象的问题,所以这是R里普遍的现象,而 ggplot2 之所以有这个问题,因为返回的不是图,而是对象。

假设你有一个变量 x <- 5 ,你打 x ,它会显示 5 ,而如果在循环里呢?

不信你试试以下两段循环:

for (i in 1:3) x
for (i in 1:3) print(x)

第一段啥都不显示,第二段显示了。在循环里你的 x ,啥都没干,扔了。

那么为什么呢?因为在循环里,R不会自做聪明地去打印任何东西,或者做其它任何的操作,除非你让它干。

为什么没有循环的脚本,在终端里跑可以,跑脚本却不行?

这是交互与否的问题,你如果是交互环境,R是面向用户,它自做聪明地要方便用户。而如果你不是在交互,那么你是开发者,你理应知道自己想干什么,所以说有这个问题的人,你们还只是用户的水平,不要以为写两句脚本就是码农。

你跑下面的代码,返回的是 FALSE

Rscript -e 'interactive()'

而你在R终端里跑 interactive ,返回的是 TRUE

一点提醒

~/.Rprofile 会影响你的R终端和R脚本,所以你额外的东西,放在了 ~/.Rprofile 里,相当于在你的R脚本里预先跑了 ~/.Rprofile ,而你的脚本拿到别人的机器上跑,别人可能没有 ~/.Rprofile ,或者有却与你的不同,于是你的脚本挂了,因为运行环境不一致。所以在定义 ~/.Rprofile 的时候,要小心。你最好能够加一个判断语句,知道自己是在终端还是脚本,如果是脚本不加载,终端才加载。于是你用终端的时候方便,你写脚本的时候不影响,起码保证你在自己机器上跑的脚本和在别人机器上跑的是一样的。如果你懂这些,再说自己是用 python 还是 R 吧。许多人声称在用某种语言做开发,其实只是用户,在用别人开发好的包,在穿别人做好的内裤(取 java 类库的谐音),所以我一直强调,也别扯什么语言了,谁的内裤多,谁就是超人,就喊谁当爹!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PHP5与MySQL5 Web开发技术详解

PHP5与MySQL5 Web开发技术详解

杜江 / 电子工业出版社 / 2007-11 / 79.00元

《PHP5与MySQL5 Web开发技术详解》(含光盘)是目前中文版本第一个真正介绍PHP5及MYSQL5新增语法与功能的权威宝典!一起来看看 《PHP5与MySQL5 Web开发技术详解》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具