作为一名开发人员,你可以超快速地掌握 R 语言。
如果你已经是开发人员,你不需要了解太多关于新语言的知识就能阅读和理解代码片段,并编写自己的小程序和程序。
在这篇文章中,你将了解开始阅读和编写 R 脚本所需的基本语法、数据结构和控制结构。
使用我的新书《R 机器学习精通》**启动你的项目**,其中包含**逐步教程**和所有示例的 **R 源代码文件**。
让我们开始吧。

面向开发人员的 R 语言速成课程
图片来源:hackNY.org,部分权利保留。
R 语法不同,但又相同
R 中的语法看起来令人困惑,但只是开始时如此。
它是一种较老的 LISP 风格语言,受一种更古老的语言(S)启发。赋值语法可能是你将看到的最奇怪的东西。赋值使用箭头 (<-) 而不是单个等号 (=)。
R 拥有所有你熟悉的控制流结构,如 if-then-else、for 循环和 while 循环。
你可以为你的脚本创建自己的函数和辅助函数库。
如果你以前做过任何脚本编程,例如 JavaScript、Python、Ruby、BASH 或类似的语言,那么你将很快学会 R 语言。
你已经会编程,只需学习 R 语法
作为一名开发人员,你已经知道如何编程。
你可以接受一个问题,并思考出所需的程序类型和数据结构。你使用的语言只是一个细节。你只需要将你的解决方案构想映射到你正在使用的语言的具体细节上。
这就是你如何能非常快速地开始使用 R 语言。
要开始,你需要了解绝对的基础知识。例如:
- 我们如何将数据赋值给变量?
- 我们如何使用不同的数据类型?
- 我们如何使用数据结构来处理数据?
- 我们如何使用标准的流控制结构?
- 如何使用函数和第三方包?
通过查看代码示例,你可以了解这些问题的答案。然后你可以:
- 将你正在阅读的第三方代码映射到这些示例上,以便更好地理解它们。
- 根据示例从头开始编写代码。
让我们快速浏览一下 R 的基本语法
需要更多关于R机器学习的帮助吗?
参加我为期14天的免费电子邮件课程,了解如何在您的项目中使用R(附带示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
R 语言速成课程(从这里开始)
在本节中,我们将快速了解 R 中使用的基本语法。
阅读(最好是实际操作)本节中的示例后,作为开发人员,你将具备足够的背景知识,可以开始阅读和理解其他人的 R 代码。
你还将有信心开始编写自己的小型 R 脚本。
本节中的示例分为以下几个部分:
- 赋值
- 数据结构
- 流程控制
- 函数
- 包
启动 R 交互式环境(在命令行输入 R),然后我们开始吧。
1. 赋值
R 语言中赋值的关键是用于赋值的箭头运算符 (<-)。
下面是赋值整数、双精度浮点数、字符串和布尔值的示例,并依次将它们打印到控制台。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
> # 整数 > i <- 23 > i [1] 23 > # 双精度浮点数 > d <- 2.3 > d [1] 2.3 > # 字符串 > s <- 'hello world' > s [1] "hello world" > # 布尔值 > b <- TRUE > b [1] TRUE |
请记住,不要使用等号 (=) 进行赋值。这是 R 编程新手最常犯的错误。
2. 数据结构
R 中最常用的三种数据结构是:
- 向量
- 列表
- 矩阵
- 数据框
列表
列表提供了一组命名项,与映射类似。
1 2 3 4 5 6 7 8 |
# 创建一个命名项列表 a <- list(aa=1, bb=2, cc=3) a a$aa # 向列表添加一个命名项 a$dd=4 a |
你可以使用 list() 函数定义一个新列表。列表可以初始化为有值或为空。请注意,列表中的命名值可以使用美元运算符 ($) 访问。一旦被引用,它们就可以被读取或写入。这也是向列表添加新项的方式。
向量
向量是数据列表,可以是相同或不同类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
> # 使用 c() 函数创建向量 > v <- c(98, 99, 100) > v [1] 98 99 100 > v[1:2] [1] 98 99 > # 从整数范围创建向量 > r <- (1:10) > r [1] 1 2 3 4 5 6 7 8 9 10 > r[5:10] [1] 5 6 7 8 9 10 > # 向向量末尾添加新项 > v <- c(1, 2, 3) > v[4] <- 4 > v [1] 1 2 3 4 |
请注意,向量是 1-索引的(索引从 1 开始,而不是 0)。
你会经常使用 c() 函数将变量连接成一个向量。
矩阵
矩阵是数据表。它有维度(行和列),并且列可以命名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 创建一个 2 行 3 列的矩阵,带有命名的标题 > data <- c(1, 2, 3, 4, 5, 6) > headings <- list(NULL, c("a","b","c")) > m <- matrix(data, nrow=2, ncol=3, byrow=TRUE, dimnames=headings) > m a b c [1,] 1 2 3 [2,] 4 5 6 > m[1,] a b c 1 2 3 > m[,1] [1] 1 4 |
许多有用的绘图和机器学习算法都要求数据以矩阵形式提供。
注意矩阵中行索引 [1,] 和列索引 [,1] 的语法。
数据框
数据框对于在 R 中实际表示数据表很有用。
1 2 3 4 5 6 |
# 创建一个新的数据框 years <- c(1980, 1985, 1990) scores <- c(34, 44, 83) df <- data.frame(years, scores) df[,1] df$years |
矩阵是一种简单得多的结构,用于数学运算。数据框更适合表示数据表,并且是 R 中机器学习算法现代实现所期望的。
请注意,你可以像对矩阵一样对数据框进行行和列索引。还要注意,你可以使用其名称(df$years)引用列。
你可以继续学习的其他数据结构包括列表和数组。
3. 流程控制
R 支持所有你习惯的流程控制结构。
- 如果-那么-否则
- For 循环
- While 循环
作为开发人员,这些都是不言自明的。
如果-那么-否则
1 2 3 4 5 6 7 8 9 |
# if then else a <- 66 if (a > 55) { print("a 大于 55") } else { print("A 小于或等于 55") } [1] "a 大于 55" |
For 循环
1 2 3 4 5 6 7 8 9 10 11 |
# for 循环 mylist <- c(55, 66, 77, 88, 99) for (value in mylist) { print(value) } [1] 55 [1] 66 [1] 77 [1] 88 [1] 99 |
While 循环
1 2 3 4 5 6 7 8 |
# while 循环 a <- 100 while (a < 500) { a <- a + 100 } a [1] 500 |
4. 函数
函数允许你将代码分组并使用参数重复调用该代码。
函数主要关注两个方面:
- 调用函数
- 函数帮助
- 编写自定义函数
调用函数
你已经使用了一个函数,即用于将对象连接到向量中的 c() 函数。
R 有许多内置函数,还可以通过安装和加载第三方包来提供额外的函数。
这是一个使用统计函数计算数字向量平均值的示例:
1 2 3 4 5 |
# 调用函数计算整数向量的平均值 numbers <- c(1, 2, 3, 4, 5, 6) mean(numbers) [1] 3.5 |
函数帮助
你可以通过使用问号运算符(?)后跟函数名称来获得 R 中函数的帮助。
1 2 3 |
# mean() 函数的帮助 ?mean help(mean) |
或者,你可以调用 `help()` 函数并将你需要帮助的函数名作为参数传递(例如,`help(mean)`)。
你可以通过调用 `example()` 函数并传入函数名作为参数来获取函数的示例用法。
1 2 |
# mean 函数的示例用法 example(mean) |
自定义函数
你可以定义自己的函数,这些函数可以带参数,也可以不带参数,也可以返回结果,也可以不返回结果。
下面是一个计算并返回三个数字之和的自定义函数示例:
1 2 3 4 5 6 7 8 9 |
# 定义自定义函数 mysum <- function(a, b, c) { sum <- a + b + c return(sum) } # 调用自定义函数 mysum(1,2,3) [1] 6 |
5. 包
包是第三方 R 代码的分发方式。综合 R 归档网络 (CRAN) 提供第三方 R 包的托管和列表,你可以下载这些包。
安装包
你可以通过调用一个函数来安装托管在 CRAN 上的包。然后会弹出一个对话框,询问你希望从哪个镜像下载该包。
例如,以下是你如何安装 caret 包的方法,它在机器学习中非常有用:
1 2 3 4 |
# 安装 caret 包 install.packages("caret") # 加载包 library(caret) |
包的帮助
一个包可以提供许多新函数。你可以在它的 CRAN 页面上阅读有关该包的信息,但你也可以在 R 中使用 library 函数获取该包的帮助。
1 2 |
# caret 包的帮助 library(help="caret") |
5 件要记住的事情
以下是开始使用 R 时需要记住的五个快速提示:
- 赋值。R 使用箭头运算符 (<-) 进行赋值,而不是单个等号 (=)。
- 大小写敏感。R 语言是大小写敏感的,这意味着 C() 和 c() 是两个不同的函数调用。
- 帮助。你可以使用 `help()` 函数或 `?` 运算符获取任何运算符或函数的帮助,并使用 `??` 运算符获取包的帮助。
- 如何退出。你可以通过调用 `q()` 函数退出 R 交互式环境。
- 文档。R 安装时附带了许多有用的文档。你可以在浏览器中通过键入 `help.start()` 来查看它们。
获取一本参考书
网上有很多很棒的资源可以学习如何使用 R。
我建议找一本好的参考书,并放在手边。我使用并推荐《R in a Nutshell》。
总结
在这篇文章中,你学习了 R 语言基本语法的速成课程。
作为开发人员,你现在已经掌握了阅读他人 R 脚本所需的知识。
你也有工具可以在 R 交互式环境中开始编写自己的小程序。
下一步
你是否完成了所有示例?
- 启动 R。
- 完成教程。
- 让我知道你的进展如何(发表评论)
你有什么问题吗?还有其他你想了解的内容吗?
留下评论,让我知道。
感谢您的快速参考。我想知道,我们是应该选择 R 还是 Python 进行机器学习,因为我们知道 Python 速度快且没有内存问题。请回复。
Python 很棒,因为你可以用相同的语言开发模型并部署它们。
R 平台拥有最多且最强大的机器学习算法,但更适合研发和一次性项目。
希望这能有所帮助。
非常感谢,这对初学者非常有帮助。
不客气,Manjunath。我希望你和所有访客都能在机器学习方面变得出色。
你好 Jason,
你能帮忙回答以下 3 个问题吗?
a) 有人说父环境是封闭环境,但有人说父环境是函数调用环境,哪个是正确的?
b) 由于没有类型,如何实现函数重载?
c) 建模和绘图函数如何实现动态作用域?它们为什么必须是动态作用域?
谢谢你,
蒂姆
蒂姆,我不知道。我教机器学习,而不是 R 编程的精妙之处。
你可能更适合阅读一本关于 R 编程的书,例如:《R 编程艺术:统计软件设计之旅》
晚上好,杰森,
感谢您的回复,我非常感激。
我查阅了一些书籍,但它们都没有解释到能让我产生“啊哈”的感觉。不过,我会查看您推荐的那本书。
是的,R 对程序员不太友好 :/
同意。
甚至“=”也作为赋值运算符使用。
箭头和 = 之间真正的区别是什么?
好问题。“=”有时会给你带来意想不到的行为,这就是为什么我强烈建议你避免使用它。R 中的约定是“<-”。如果你想了解技术细节,这篇帖子可能会为你解答:http://blog.revolutionanalytics.com/2008/12/use-equals-or-arrow-for-assignment.html
Jason
我正在用遗传算法进行临床数据挖掘的博士研究。你会推荐 Python、R 还是 Matlab?
你好 Sreejith,
我认为 Python 非常适合构建系统的程序员。
我认为 R 非常适合研发以及深入研究数据/统计/模型。
我认为 Matlab 非常适合学习,但不适合实际操作。
谢谢 Jason
谢谢 Jason
很高兴你觉得它有用,Tounsi。
我能从你这里得到一些机器学习的小项目吗?
这里有一些项目想法,Amit
https://machinelearning.org.cn/tour-of-real-world-machine-learning-problems/
非常感谢。
不客气。
你好,杰森,
我已经通读了上面提供的所有代码,除了 while 循环,其他都很好。请给我解释一下。谢谢。
你可以在这里了解更多关于 while 循环的信息:
https://www.datamentor.io/r-programming/while-loop/
感谢您对编写 R 程序的帮助。
不客气。
谢谢!这篇文章超级有用。
不客气,我很高兴听到这个消息。
太棒了!
我还找到了这份文档:https://cran.r-project.cn/doc/contrib/Paradis-rdebuts_en.pdf
您会推荐它作为有用的资源吗?