R的交互与脚本模式

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

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


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

查看所有标签

猜你喜欢:

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

计算机算法导引

计算机算法导引

卢开澄 / 第2版 (2006年1月1日) / 2006-1 / 38.0

本书为《计算机算法导引——设计与分析》的第2版。书中内容分3部分:第1部分是基本算法,按方法论区分,包含优先策略与分治策略、动态规划、概率算法、并行算法、搜索法、数据结构等;第2部分是若干专题,包括排序算法、计算几何及计算数论、线性规划;第3部分是复杂性理论与智能型算法,其中,智能型算法主要介绍了遗传算法和模拟退火算法。本书可作为计算机系本科学生及研究生教材,数学系师生和科研T作者也可将其作为参考......一起来看看 《计算机算法导引》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具