R语言工作流程:基础

https://wp.me/p80aHo-2oS

Table of Contents

你现在已经有了一些运行 R 代码的经验。我们并没有给出太多细节,但你显然已经掌握了基础!当你开始使用 R 进行编程时,感到沮丧是很正常的,因为它对标点符号非常严格,哪怕一个字符放错位置都会引发报错。不过,虽然你可能会感到些许挫败,但可以放心,这种经历是典型且暂时的:每个人都会经历,而克服它的唯一办法就是不断尝试。

在我们继续之前,先确保你已经打下了运行 R 代码的坚实基础,并且了解一些最有用的 RStudio 功能。

代码基础

让我们回顾一些此前为了尽快让你开始绘图而省略的基础内容。你可以使用 R 来进行基本的数学计算:

1 / 200 * 30
(59 + 73 + 2) / 3
sin(pi / 2)

你可以使用赋值运算符 <- 来创建新对象:

x <- 3 * 4
x

请注意,x 的值不会被打印出来,它只是被存储了。如果你想查看该值,可以在控制台中输入 x。

你可以使用 c() 将多个元素组合成一个向量

primes <- c(2, 3, 5, 7, 11, 13)

并且,对向量进行的基本算术运算会作用于该向量的每一个元素:

primes <- c(2, 3, 5, 7, 11, 13)
primes * 2
primes - 1

所有用于创建对象的 R 语句(即赋值语句)都具有相同的形式:

对象名称 <-

阅读这段代码时,可以在脑海中将其理解为“对象名获得值”。

你会进行大量赋值操作,而输入 <- 会有点麻烦。你可以使用 RStudio 的键盘快捷键来节省时间:Alt + -(减号)。注意,RStudio 会自动在 <- 两侧添加空格,这是良好的代码格式习惯。代码即使在状态良好时也可能难以阅读,所以给你的眼睛一点缓解,记得使用空格。

注释

在一行中,# 之后的任何文本都会被 R 忽略。这使你可以编写注释,这些文本会被 R 忽略,但供其他人阅读。我们有时会在示例中加入注释来解释代码中发生了什么。

注释可以帮助简要说明接下来的代码在做什么。

# create vector of primes
primes <- c(2, 3, 5, 7, 11, 13)
# multiply primes by 2
primes * 2

对于像这样的简短代码片段,不一定需要为每一行代码都添加注释。但随着你编写的代码变得更加复杂,注释可以为你(以及你的协作者)节省大量理解代码所做工作的时间。

使用注释来解释代码的“为什么”,而不是“做了什么”或“如何做”。通过仔细阅读代码,总是可以弄清楚代码在做什么以及如何实现,即使过程可能有些繁琐。如果你在注释中描述了每一个步骤,然后又修改了代码,就需要记得同时更新注释,否则将来回看代码时会造成困惑。

理解为什么要这样做要困难得多,甚至可能无法从代码本身看出来。例如,geom_smooth() 有一个名为 span 的参数,用于控制曲线的平滑程度,值越大曲线越平滑。假设你决定将 span 的值从默认的 0.75 改为 0.9:未来的读者很容易理解发生了什么,但如果你没有在注释中说明你的思考过程,就没有人会知道你为什么要修改默认值。

对于数据分析代码,使用注释来解释你的整体思路,并在遇到重要见解时将其记录下来。这些信息无法从代码本身重新获取。

变量名中有什么含义?

对象名称必须以字母开头,并且只能包含字母、数字、_ 和 .。你应该让对象名称具有描述性,因此需要为多个单词采用一种命名约定。我们推荐使用 snake_case,即用下划线 _ 分隔小写单词。

i_use_snake_case
otherPeopleUseCamelCase

进行一次赋值:

this_is_a_really_long_name <- 2.5

要查看这个对象,可以试试 RStudio 的自动补全功能:输入“this”,按 TAB,继续输入字符直到形成唯一前缀,然后按回车。

假设你犯了一个错误,this_is_a_really_long_name 的值应该是 3.5,而不是 2.5。你可以使用另一个键盘快捷键来帮助修正。例如,可以按 ↑ 调出你刚刚输入的命令并进行编辑。或者,输入“this”,然后按 Cmd/Ctrl + ↑ 来列出所有以这些字母开头的历史命令。使用方向键进行选择,然后按回车重新输入该命令。把 2.5 改为 3.5 并重新运行。

再进行一次赋值:

r_rocks <- 2^3

让我们试着查看它:

r_rock
R_rocks

这说明了你与 R 之间的一种隐含约定:R 会为你完成繁琐的计算,但作为交换,你必须在指令上做到完全精确。否则,你很可能会收到一条错误提示,说明找不到你要的对象。拼写错误很重要;R 无法读懂你的想法,也不会在你输入 r_rock 时自动理解为 r_rocks。大小写同样重要;类似地,当你输入 R_rocks 时,R 也不会自动理解为 r_rocks。

调用函数

R 拥有大量内置函数,调用方式如下:

函数名(参数1 =1, 参数2 =2, …)

让我们试试使用 seq(),它可以生成规则的数值序列,同时也顺便学习一些 RStudio 的实用功能。输入 se 并按 TAB,会弹出一个列表显示可能的补全项。通过继续输入(如输入 q)来明确选择 seq(),或者使用 ↑/↓ 方向键进行选择。注意弹出的浮动提示,它会提醒你该函数的参数和用途。如果你需要更多帮助,可以按 F1,在右下角的帮助面板中查看完整说明。

当你选定所需函数后,再按一次 TAB。RStudio 会自动为你补全匹配的开括号 ( 和 闭括号 )。输入第一个参数的名称 from,并将其设为 1。然后输入第二个参数的名称 to,并将其设为 10。最后按回车。

seq(from = 1, to = 10)

在函数调用中,我们常常省略前几个参数的名称,因此可以将其改写如下:

seq(1, 10)

输入以下代码,并注意 RStudio 也会为成对的引号提供类似的辅助:

x <- "hello world"

引号和括号必须始终成对出现。RStudio 会尽力帮助你,但仍然有可能出错并导致不匹配。如果发生这种情况,R 会显示续行符“+”:

符号 + 表示 R 正在等待更多输入;它认为你还没有完成。通常这意味着你遗漏了一个 ” 或一个 )。要么补上缺失的成对符号,要么按 ESCAPE 取消该表达式并重新尝试。

请注意,右上角窗格中的环境(Environment)选项卡会显示你创建的所有对象:

练习

  • 为什么这段代码无法运行?
my_variable <- 10
my_varıable

仔细观察!(这看起来也许毫无意义,但训练你的大脑去注意哪怕最细微的差别,在编程时会带来回报。)

  • 对以下每条 R 命令进行修改,使其能够正确运行:
libary(todyverse)
ggplot(dTA = mpg) +
geom_point(maping = aes(x = displ y = hwy)) +
geom_smooth(method = "lm)

正确的版本

library(ggplot2)
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth(method = "lm")
  • 按下 Option + Shift + K / Alt + Shift + K。会发生什么?如何通过菜单进入相同的位置?
  • 运行以下代码。两张图中哪一张被保存为 mpg-plot.png?为什么?
my_bar_plot <- ggplot(mpg, aes(x = class)) +
geom_bar()
my_scatter_plot <- ggplot(mpg, aes(x = cty, y = hwy)) +
geom_point()
ggsave(filename = "mpg-plot.png", plot = my_bar_plot)

保存的是 my_bar_plot(柱状图)

原因是你在 ggsave() 里明确指定了 plot = my_bar_plot,所以保存的就是这个对象,而不是最近绘制的图(my_scatter_plot)。

总结

现在你已经对 R 代码的工作方式有了更多了解,也掌握了一些在将来回看代码时帮助理解它的技巧。接下来,我们将继续你的数据科学之旅,向你介绍 dplyr——tidyverse 中用于数据转换的包,无论是选择重要变量、筛选感兴趣的行,还是计算汇总统计量。

评论

发表评论

了解 数据控|突破是我们的每一步 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读