第1天——R语言介绍

为什么要使用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语言程序。
      第1天——R语言介绍_第1张图片

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。

第1天——R语言介绍_第2张图片

something <- 'hello world!'
print(something)

第1天——R语言介绍_第3张图片

  • 书上的示例代码
# 创建数据集
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

第1天——R语言介绍_第4张图片

工作空间

  • 工作空间就是当前的工作环境,存储着用户的变量数据。无论是终端还是Rstudio,退出当前session时都会询问是否保留当前镜像。

第1天——R语言介绍_第5张图片

  • 我们可以使用tree命令(需要使用Linux终端进入到项目目录下执行)看看一个R的项目里面一般都有哪些文件。可以看到,工作空间的镜像是保存到.RData里面的。退出session时保存为镜像,就是将内存中的数据写到硬盘里面。开启session时加载镜像,就是将硬盘的数据从硬盘加载到内存,也就是数据的序列化以及反序列化的过程。

第1天——R语言介绍_第6张图片

  • 工作空间的镜像一般都是保存到工作目录里面的,如果你使用了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()
      

第1天——R语言介绍_第7张图片

  • 图像输出,键入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()
    

第1天——R语言介绍_第8张图片

一门成熟的语言,不仅仅需要其自身强大,还需要其有良好的生态,R语言也不例外。我们可以下载许许多多的模块来拓展R的功能,这些模块是函数、数据、预编译代码的组合,也被叫做R包(package)。计算机上存储R包的目录叫做库(library)。

  • 一些R包相关的函数
# 显示库所在的位置
.libPaths()

# 显示库中有那些包
library()

# 查看哪些包已经加载且可以使用
search()

# 查看已安装的包、安装位置、版本信息
installed.packages()
  • R包的安装:可以看这个文章,更全面 http://t.csdn.cn/k82bM。

  • R包的加载:使用library("xxx")加载指定的R包,在一个session中,包只需载入一次。这也说明,如果你想取消加载所有后来加载的R包,重启session即可。

第1天——R语言介绍_第9张图片

  • 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
      第1天——R语言介绍_第10张图片

    • R CMD BATCH batch.R &,加上&后是非阻塞的,但是不代表是后台执行,断开执行脚本的那个ssh连接后,程序会终止运行。
      非阻塞

结语

  • 在本章中,我们学习了R、R Studio的基本界面、工作空间的管理、基本的输入输出以及R包等基础概念。但是我们好像还写不出什么复杂的代码,因为我们还没有学习到数据结构,条件控制等概念,让我们一起期待下一章节!

你可能感兴趣的:(r语言,开发语言)