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 类库的谐音),所以我一直强调,也别扯什么语言了,谁的内裤多,谁就是超人,就喊谁当爹!


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

查看所有标签

猜你喜欢:

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

结网@改变世界的互联网产品经理

结网@改变世界的互联网产品经理

王坚 / 人民邮电出版社 / 2013-5-1 / 69.00元

《结网@改变世界的互联网产品经理(修订版)》以创建、发布、推广互联网产品为主线,描述了互联网产品经理的工作内容,以及应对每一部分工作所需的方法和工具。产品经理的工作是围绕用户及具体任务展开的,《结网@改变世界的互联网产品经理(修订版)》给出的丰富案例以及透彻的分析道出了从发现用户到最终满足用户这一过程背后的玄机。新版修改了之前版本中不成熟的地方,强化了章节之间的衔接,解决了前两版中部分章节过于孤立......一起来看看 《结网@改变世界的互联网产品经理》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码