为什么要使用R
-
功能强大
-
R是开源的、免费的(也有商业化版本,但是免费版足够我们使用了)
-
多平台运行
-
等等
R的获取和安装
-
R可以从CRAN免费下载:https://cran.r-project.org/,这里是下载R语言内核,也就是实际运行R语言代码的程序。
-
一般而言,为了方便开发调试,我们会安装R的IDE,也就是R Studio,其分为
- R studio:https://posit.co/products/open-source/rstudio/,一般安装在个人电脑上
- R studio server:https://posit.co/products/open-source/rstudio-server/,一般安装在服务器上面。为了节省服务器资源,大部分作为服务器的Linux系统是没有安装图形化界面的。R studio server实际上就是安装在服务器上面的一套web程序,用户通过浏览器访问R studio server的网页前端,在上面进行操作,网页将命令通过HTTP或者其他网络协议回传到服务器的R studio server后端,R studio server后端再通过R语言内核执行R语言程序。
R的使用
-
R是一种区分大小写的解释型语言。与解释型语言对应的是编译型语言,我们先了解一些什么是编译型语言。首先我们需要知道的一点是:计算机并不认识我们写的那些花里胡哨的代码,它只能执行机器语言文件。编译型语言会将我们写的代码编译为可执行的机器码,如C、C++等都是编译型语言,编译器在编译时会进行语法检查,语法有问题的话编译阶段就报错了。解释型语言则是在运行时才翻译为机器码,如Python、R都是解释型语言,执行一次翻译一次,即使你写的脚本后面有语法问题,也是运行到那一行的时刻才报错。
-
R使用
<-
,而不是传统的=
作为赋值符号。如果你有其它编程语言基础,那这点可能得纠正一下,别搞混了。R也允许使用=
赋值,但是不推荐,在有的地方会出错。 -
“当我写下这些代码的时候,上帝和我都知道这些代码的含义;一个月之后,只有上帝知道了”。R使用
#
进行注释,注释是程序员写在代码文件中的一些解释性的语言,是写给自己以及队友看的,就是为了让除了上帝之外的人也看得懂之前写的代码。 -
当我们启动一个R终端,就是开启了一个R session(会话),一次会话期间的所有数据都保存在内存中。
国际惯例
-
依据国际惯例,我们来运行一个hello world程序。为了顺带学习Linux基础知识,我安装了一个Ubuntu Server的系统,然后安装了R Studio Server,后续也会基于这个环境进行演示。
-
使用R studio运行hello world程序,hello world程序不仅是象征性的,还能检测你环境是否配置成功~
-
首先我们养成一个好习惯:使用R studio项目来区分不同的代码。平时写代码时,你可以一个课题新建一个项目,或者一个章节新建一个项目。这里我新建一个项目,名称为day1。
something <- 'hello world!'
print(something)
- 书上的示例代码
# 创建数据集
age <- c(1,3,5,2,11,9,3,9,12,3)
weight <- c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1)
# 计算均值
mean(weight)
# 计算标准差
sd(weight)
# 计算相关系数
cor(age,weight)
# 绘制散点图
plot(age,weight)
获取帮助
- 这里的获取帮助指的是查看函数的使用教程,一般好的R包,都会配有完整的示例代码与教程。如上面的示例代码中,sd函数是干什么的?我们可以这样查看
?sd
工作空间
- 工作空间就是当前的工作环境,存储着用户的变量数据。无论是终端还是Rstudio,退出当前session时都会询问是否保留当前镜像。
- 我们可以使用tree命令(需要使用Linux终端进入到项目目录下执行)看看一个R的项目里面一般都有哪些文件。可以看到,工作空间的镜像是保存到.RData里面的。退出session时保存为镜像,就是将内存中的数据写到硬盘里面。开启session时加载镜像,就是将硬盘的数据从硬盘加载到内存,也就是数据的序列化以及反序列化的过程。
- 工作空间的镜像一般都是保存到工作目录里面的,如果你使用了R的项目,工作目录就是项目的路径下,否则就是家目录(/home/你的用户名/)。你可以通过下面的方式查看、指定工作目录。(但是我不推荐自行配置工作目录,而是使用项目来区分和管理工作空间)
# 查看
getwd()
# 设置
setwd("你指定的目录")
- 你也可以手动指定将镜像保存到哪里,以及从哪里加载镜像。
# 保存工作目录全部对象到指定文件
save.image("/home/equator/r/test.RData")
# 保存指定对象到指定文件
save(list = c("age","something","weight"), file = "/home/equator/r/test2.RData")
# 加载
load("/home/equator/r/test.RData")
- 其它的一些管理工作空间的命令
# 列出所有对象
ls()
# 删除某个对象
rm(xx)
输入输出
这里的输入输出是相对于R内核而言的,输入即给R内核下达指令,输出即R内核将结果输出到某个地方,这些地方包括文本、PNG、PDF等文件。
-
输入
- 进入R交互会话(如在Linux终端键入R)后,可以从键盘输入
- 也可以输入一个脚本文件,使用
source("test.R")
即可
-
输出
- 文本输出,键入
sink("test_out.txt")
后,所有输出都会重定向到指定的文件中;键入sink()
即可关闭重定向 -
sink("test_out.txt") a <- c("hello", "input", "output") print(a) sink()
- 文本输出,键入
- 图像输出,键入
pdf("test.png")或者png("test.png")
后,所有图像输出都会重定向到指定文件,键入dev.off()
即可关闭重定向 - 结合前面的例子练习一下,可以看到,文本输出与图像输出各论各的,互不干扰。
-
# append=T,追加内容而不是直接覆盖,split=T,控制台与文件都输出 sink("io_example_out.txt", append=TRUE, split=TRUE) pdf("test.pdf") png("test.png") age <- c(1,3,5,2,11,9,3,9,12,3) weight <- c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1) print(mean(weight)) sd(weight) cor(age,weight) plot(age,weight) sink() dev.off()
包
一门成熟的语言,不仅仅需要其自身强大,还需要其有良好的生态,R语言也不例外。我们可以下载许许多多的模块来拓展R的功能,这些模块是函数、数据、预编译代码的组合,也被叫做R包(package)。计算机上存储R包的目录叫做库(library)。
- 一些R包相关的函数
# 显示库所在的位置
.libPaths()
# 显示库中有那些包
library()
# 查看哪些包已经加载且可以使用
search()
# 查看已安装的包、安装位置、版本信息
installed.packages()
-
R包的安装:可以看这个文章,更全面 。
-
R包的加载:使用
library("xxx")
加载指定的R包,在一个session中,包只需载入一次。这也说明,如果你想取消加载所有后来加载的R包,重启session即可。
help(package="包名")
,可以通过help函数查看R包的官方使用教程,如果你安装的是小众的包,R包作者压根没写教程,那你只能啃源码了。。。
通过终端执行R脚本(批处理)
-
终端执行
R CMD BATCH [options] infile [outfile]
- options,可选的,指定控制执行的细节
- infile,输入文件,即R脚本,后缀一般是.R
- outfile,可选的,输出文件,后缀一般是.Rout
-
尝试执行批处理,编辑
batch.R
文件如下
cnt <- 0;
while(cnt < 60)
{
cnt <- cnt+1;
# 睡眠1秒,避免循环太快结束
Sys.sleep(1);
print(cnt);
}
- 批处理执行
-
执行
R CMD BATCH batch.R
后会阻塞等待执行完毕
-
此时在另外一个终端打开输出文件
tail -f batch.Rout
,可以动态地看到程序在不断地输出内容。(由于我们没有指定outfile
,所以R自动创建了这样一个文件:从infile
中获取文件名,拓展名为.Rout
)
-
R CMD BATCH batch.R &
,加上&后是非阻塞的,但是不代表是后台执行,断开执行脚本的那个ssh连接后,程序会终止运行。
-
结语
- 在本章中,我们学习了R、R Studio的基本界面、工作空间的管理、基本的输入输出以及R包等基础概念。但是我们好像还写不出什么复杂的代码,因为我们还没有学习到数据结构,条件控制等概念,让我们一起期待下一章节!