R 和 RStudio

最后更新于 2026-11-07 | 编辑此页

预计用时: 30 分钟

概述

问题

  • 什么是 R 和 RStudio?

学习目标

  • 描述 RStudio 的脚本、控制台、环境和图表窗格的用途。
  • 将一组分析的文件和目录组织成一个 R 项目,并理解工作目录的作用。
  • 使用 RStudio 内置的帮助界面搜索有关 R 函数的更多信息。
  • 演示如何向 R 用户社区提供足够的信息以进行故障排除。

本集基于 Data Carpentries 的 Data Analysis and Visualisation in R for Ecologists 课程。

什么是 R?什么是 RStudio?


R 一词用于指代编程语言、统计计算环境以及解释使用该语言编写的脚本的软件。

RStudio 目前是一种非常流行的方式,不仅可以用来编写 R 脚本,还能用于与 R 软件进行交互1。为了正常运行,RStudio 需要 R,因此两者都必须安装在您的计算机上。

RStudio IDE 快捷键表 提供的信息远比本文所涵盖的要多,但对于学习键盘快捷键和探索新功能非常有帮助。

为什么要学习 R?


R 不需要频繁地点击操作,而这正是其优势所在。

学习曲线可能比其他软件更陡峭,但使用 R 时,分析结果并不依赖于记忆一连串的点击操作,而是基于一系列书面命令,而这正是其优势所在!因此,如果你因为收集了更多数据而想要重新进行分析,你不需要记住按哪个按钮、按什么顺序才能获得结果;你只需再次运行你的脚本即可。

使用脚本可以让分析过程中采取的步骤清晰可见,而且你编写的代码可以由他人检查,从而获得反馈并发现错误。

使用脚本会迫使你对所做的工作有更深入的理解,并有助于你学习和掌握所使用的方法。

R 代码有助于实现可复现性

可复现性意味着其他人(包括未来的你自己)在使用相同的分析代码时,能够从同一数据集获得相同的结果。

R 可与其他工具集成,从您的代码中生成论文或报告。如果您收集了更多数据,或修正了数据集中的错误,论文或报告中的图表和统计检验将自动更新。

越来越多的期刊和资助机构要求分析结果具有可复现性,因此掌握 R 将使你在满足这些要求时占据优势。

R 具有跨学科性和可扩展性

R 提供了一个框架,允许你安装 10,000 多个2 包来扩展其功能,从而将许多科学领域的统计方法相结合,以最好地适配你分析数据所需的分析框架。例如,R 拥有用于图像分析、GIS、时间序列、群体遗传学等诸多领域的包。

Two graphs showing the exponential increase of the number of CRAN packages from 2000 to 2018. The figure on the right shows linear trend for the log of number of packages.
Exponential increase of the number of packages available on CRAN, the Comprehensive R Archive Network. From the R Journal, Volume 10/2, December 2018.

R 适用于各种形状和规模的数据

您通过 R 学习的技能可以轻松适配数据集的规模。无论您的数据集包含数百行还是数百万行,对您来说都没有太大影响。

R 专为数据分析而设计。它配备了特殊的数据结构和数据类型,使缺失数据和统计因子的处理变得十分便捷。

R 可以连接到电脑上或网络上的电子表格、数据库以及许多其他数据格式。

R 能生成高质量的图表

R 的绘图功能非常丰富,允许您调整图表的任何方面,以最有效地传达数据所包含的信息。

R 拥有一个规模庞大且热情友好的社区

每天有数以千计的人使用 R。其中许多人愿意通过邮件列表和 Stack Overflow 等网站,或在 RStudio 社区 为你提供帮助。这些广泛的用户社区延伸至生物信息学等专业领域。R 社区的一个子集是 Bioconductor,这是一个旨在分析和理解“当前及新兴生物测定数据”的科学项目。本工作坊由 Bioconductor 社区成员开发;如需了解更多关于 Bioconductor 的信息,请参阅配套工作坊 “Bioconductor 项目”。

R 不仅免费,而且还是开源且跨平台的

任何人都可以查看源代码,以了解 R 的工作原理。得益于这种透明度,出错的可能性较低,而且如果你(或他人)发现了错误,可以报告并修复 Bug。

熟悉 RStudio 的用法


让我们先来了解一下 RStudio,这是一个用于操作 R 的集成开发环境 (IDE)。

RStudio IDE 这一开源产品根据 Affero 通用公共许可证 (AGPL) v3 免费提供。RStudio IDE 也提供商业许可证,并可获得 Posit, Inc. 的优先电子邮件支持。

我们将使用 RStudio IDE 编写代码、浏览计算机上的文件、检查即将创建的变量,以及可视化将生成的图表。RStudio 还可用于其他用途(例如版本控制、开发软件包、编写 Shiny 应用),但这些内容在本次工作坊中将不予涵盖。

Screenshot of the RStudio interface showing the typical four panel setup.
RStudio interface screenshot. Clockwise from top left: Source, Environment/History, Files/Plots/Packages/Help/Viewer, Console.

RStudio 窗口分为 4 个“窗格”:

  • 用于脚本和文档的 Source(左上角,默认布局)
  • 您的 环境/历史记录(右上角),
  • 您的 文件/图表/包/帮助/查看器(右下角),以及
  • R 控制台(左下角)。

这些窗格的布局及其内容均可自定义(参见菜单,Tools -> Global Options -> Pane Layout)。

使用 RStudio 的优势之一是,编写代码所需的所有信息都集中在单个窗口中。此外,凭借大量快捷键、自动补全以及在 R 开发过程中常用的主要文件类型的高亮显示,RStudio 将使输入更加便捷,且更不易出错。

设置指南


将一组相关的数据、分析和文本整合在同一个文件夹中,即所谓的工作目录,是一个良好的实践。这样,该文件夹内的所有脚本都可以使用相对路径来指定文件在项目中的位置(而非绝对路径,后者指向文件在特定计算机上的具体位置)。采用这种方式,在计算机上移动项目并与他人共享时,无需担心底层脚本是否仍能正常运行,会变得容易得多。

RStudio 通过其“项目”界面提供了一套实用的工具来实现这一点。该界面不仅能为您创建工作目录,还能记住其位置(方便您快速导航),并可选择保留自定义设置和打开的文件,以便在休息后更轻松地恢复工作。请按照以下步骤为本教程创建“R 项目”。

  1. 启动 RStudio。
  2. 在 File 菜单下,点击 New project。选择 New directory,然后选择 New project。
  3. 为此新文件夹(或“目录”)输入名称,并选择一个方便的位置。这将成为您本次会话(或整个课程)的工作目录(例如,bioc-intro)。
  4. 点击 Create project。
  5. (可选)将偏好设置为“从不”在 RStudio 中保存工作区。

RStudio 的默认设置通常效果良好,但将工作区保存为 .RData 可能会很繁琐,尤其是当你处理较大的数据集时。若要关闭此功能,请前往“工具” –> “全局选项”,并在“退出时将工作区保存为 .RData”处选择“从不”选项。

Screenshot of the RStudio General Options panel.
Set ‘Save workspace to .RData on exit’ to ‘Never’

为了避免Windows 与其他操作系统之间的字符编码问题,我们将默认设置为 UTF-8:

Screenshot of the RStudio Code Options panel.
Set the default text encoding to UTF-8 to save us headache in the coming future. (Figure from the link above).

整理工作目录

在各个项目中使用统一的文件夹结构有助于保持有序,并方便日后查找和归档。当您拥有多个项目时,这一点尤为有用。通常情况下,您可以为 脚本、数据 和 文档 分别创建目录(文件夹)。

  • data/ 使用此文件夹存储原始数据以及您为特定分析而创建的中间数据集。为了确保透明度和来源可追溯性,您应始终保留一份可访问的原始数据副本,并尽可能通过编程方式(即使用脚本,而非手动操作)完成数据清洗和预处理。将原始数据与处理后的数据分开也是一个好主意。例如,您可以将文件 data/raw/tree_survey.plot1.txt 和 ...plot2.txt 与由 scripts/01.preprocess.tree_survey.R 脚本生成的 data/processed/tree.survey.csv 文件分开存放。
  • documents/ 这里用于存放大纲、草稿和其他文本。
  • scripts/(或 src)这里将用于存放用于不同分析或绘图的 R 脚本,并可能设有一个用于存放函数的独立文件夹(稍后详述)。

根据项目需求,您可能需要额外的目录或子目录,但这些应当构成工作目录的骨架。

Flow diagram showing the structure of the working directory and various directory of a typical RStuio project.
Example of a working directory structure.

在本课程中,我们需要一个 data/ 文件夹来存储原始数据,在学习如何将数据导出为 CSV 文件时将使用 data_output/,而将使用 fig_output/ 文件夹来保存图表。

讨论

挑战:创建项目目录结构

在屏幕右侧的 Files 选项卡下,点击 New Folder,并在新创建的工作目录(例如 ~/bioc-intro/data)中创建一个名为 data 的文件夹。(或者,在 R 控制台中输入 dir.create("data")。)重复这些操作,创建 data_output/ 和 fig_output 文件夹。

我们将把脚本放在工作目录的根目录下,因为我们只会使用一个文件,这样会更方便。

您的工作目录现在应该如下所示:

Screenshot of RStudio's Files panel.
How it should look like at the beginning of this lesson

项目管理当然也适用于生物信息学项目3。William Noble ( Noble (2009) ) 提出了以下目录结构:

目录名称采用大号字体,文件名采用小号字体。此处仅显示部分文件。请注意,日期格式为 <year>-<month>-<day>,以便按时间顺序排序。源代码 src/ms-analysis.c 经过编译生成 bin/ms-analysis,并在 doc/ms-analysis.html 中提供文档。数据目录中的 README 文件指定了谁在何时从哪个 URL 下载了数据文件。驱动脚本 results/2009-01-15/runall 会自动生成三个子目录 split1、split2 和 split3,分别对应三组交叉验证划分。bin/parse-sqt.py 脚本由两个 runall 驱动脚本共同调用。

Figure form Nobel et al. (2009) showing a complex bioinformatics project structure.
Directory structure for a sample bioinformatics project.

一个定义明确且文档详尽的项目目录,其最重要的方面在于能够让不熟悉该项目的人4

  1. 了解该项目的内容、有哪些可用数据、运行了哪些分析以及产生了哪些结果,而最重要的是,

  2. 重新进行分析 —— 使用新数据,或更改某些分析参数。

工作目录

工作目录是一个需要理解的重要概念。它是 R 查找和保存文件的位置。在为项目编写代码时,应以工作目录的根目录为基准来引用文件,且仅需使用该结构下的文件。

使用 RStudio 项目可以简化这一过程,并确保工作目录设置正确。如果您需要检查工作目录,可以使用 getwd()。如果由于某种原因工作目录与预期不符,您可以在 RStudio 界面中通过在文件浏览器中导航至应为工作目录的位置,点击蓝色齿轮图标 More,然后选择 Set As Working Directory 来更改。或者,您也可以使用 setwd("/path/to/working/directory") 来重置工作目录。不过,您的脚本不应包含这行代码,因为在他人的计算机上运行时会报错。

示例

下面的示意图展示了工作目录 bioc-intro,其中包含 data 和 fig_output 子目录,且后者包含 2 个文件:

bioc-intro/data/
          /fig_output/fig1.pdf
          /fig_output/fig2.png

如果我们处于工作目录中,可以使用相对路径 bioc-intro/fig_output/fig1.pdf 或绝对路径 /home/user/bioc-intro/fig_output/fig1.pdf 来引用 fig1.pdf 文件。

如果我们处于 data 目录下,我们会使用相对路径 ../fig_output/fig1.pdf 或相同的绝对路径 /home/user/bioc-intro/fig_output/fig1.pdf。

与 R 交互


编程的基础在于我们编写计算机可执行的指令,然后告诉计算机执行这些指令。我们在 R 中编写指令,或称代码,因为它是一种计算机和我们都能理解的通用语言。我们将这些指令称为命令,并通过执行(也称为运行)这些命令来告诉计算机执行指令。

与 R 交互有两种主要方式:使用 控制台 或使用 脚本(包含代码的纯文本文件)。控制台窗格(在 RStudio 中为左下角面板)是可以直接输入 R 语言命令并由计算机立即执行的地方。这里也会显示已执行命令的结果。您可以直接在控制台中输入命令并按下 Enter 来执行这些命令,但一旦关闭会话,这些命令将被丢失。

由于我们希望代码和工作流程具有可复现性,最好将所需的命令输入到脚本编辑器中并保存脚本。这样一来,我们所做的一切都会有完整的记录,任何人(包括未来的自己!)都可以在自己的计算机上轻松复现结果。但请注意,仅在脚本中输入命令并不会自动运行它们——它们仍需发送至控制台进行执行。

RStudio 允许您使用 Ctrl + Enter 快捷键直接在脚本编辑器中执行命令(在 Mac 上,Cmd + Return 同样有效)。当您按下 Ctrl + Enter 时,脚本当前行上的命令(由光标指示)或当前选中的所有文本中的命令都将被发送至控制台并执行。您可以在这份 关于 RStudio IDE 的 RStudio 快捷指南 中找到其他键盘快捷键。

在分析过程中,您可能需要检查变量的内容或对象的结构,而无需必须在脚本中记录这些信息。您可以直接在控制台中输入并执行这些命令。RStudio 提供了 Ctrl + 1 和 Ctrl + 2 快捷键,让您可以在脚本窗口和控制台窗口之间切换。

如果 R 已准备好接收命令,R 控制台将显示 > 提示符。如果它接收到命令(通过输入、复制粘贴或使用 Ctrl + Enter 从脚本编辑器发送),R 将尝试执行该命令,并在准备就绪后显示结果,随后返回并显示新的 > 提示符以等待新命令。

如果 R 仍在等待您输入更多数据,因为数据尚未完整,控制台将显示 + 提示符。这意味着您尚未完成输入一个完整的命令。这是因为您没有“闭合”括号或引号,也就是说,左括号的数量与右括号不一致,或者引号的开头和结尾数量不相等。当这种情况发生且您认为已经完成了命令输入时,请点击控制台窗口内部并按下 Esc;这将取消未完成的命令,并让您回到 > 提示符。

如何在课程期间及课程结束后进一步学习?


本课程涵盖的内容将让你初步体验如何使用 R 为自己的研究分析数据。然而,若要进行更高级的操作,例如清洗数据集、使用统计方法或创建精美的图表5,你还需要学习更多知识。与任何其他工具一样,熟练且高效地掌握 R 的最佳方式,就是将其用于解决你实际的研究问题。对于初学者来说,从零开始编写脚本可能会让人感到畏难,且考虑到许多人在网上公开了代码,修改现有代码以适应你的目的可能会让你更容易入门。

Fake book cover showing a kitten with title 'Changing Stuff and Seeing What Happens.'

寻求帮助


使用 RStudio 内置的帮助界面搜索更多关于 R 函数的信息

Screenshot of RStudio's Help panel.
RStudio help interface.

获取帮助最快的方法之一是使用 RStudio 的帮助界面。该面板默认位于 RStudio 的右下角。如截图所示,通过输入关键字“Mean”,RStudio 还会尝试提供一些您可能感兴趣的建议。随后,相关描述将显示在显示窗口中。

我知道想要使用的函数名称,但不确定如何使用它

如果您需要关于某个特定函数(例如 barplot())的帮助,可以输入:

R

?barplot

如果您只需要回顾参数名称,可以使用:

R

args(lm)

我想使用一个能实现 X 功能的函数,肯定有相应的函数,但我不知道是哪一个……

如果您想寻找一个用于执行特定任务的函数,可以使用 help.search() 函数,该函数通过双问号 ?? 调用。不过,这仅会在已安装的包中查找与您的搜索请求匹配的帮助页面。

R

??kruskal

如果您找不到所需内容,可以使用 rdocumentation.org 网站,该网站可搜索所有可用包中的帮助文件。

最后,在 Google 或网上进行通用搜索“R <task>”,通常会将你引导至相应的包文档,或者引导至一个有用的论坛,那里可能已经有人问过你的问题。

我卡住了……收到了一条我不理解的错误消息

首先尝试在 Google 上搜索错误消息。不过,这并不总是奏效,因为软件包开发者通常依赖 R 提供的错误捕获机制。这会导致你得到一些泛泛的错误消息,可能对诊断问题没有太大帮助(例如“subscript out of bounds”)。如果消息非常笼统,你也可以在搜索词中加入所使用的函数或软件包的名称。

不过,你应该查看 Stack Overflow。使用 [r] 标签进行搜索。大多数问题都已经得到了解答,但挑战在于在搜索时使用正确的词汇才能找到答案:

https://stackoverflow.com/questions/tagged/r

R 入门 对于编程经验较少的人来说可能也较为晦涩,但它是了解 R 语言基础的好地方。

R FAQ 内容详尽且具有技术性,但充满了实用信息。

寻求帮助

获得他人帮助的关键在于让对方能够快速掌握你的问题。你应当尽可能让对方轻松地定位问题所在。

请尽量使用正确的词汇来描述你的问题。例如,包(package)与库(library)并非同一事物。大多数人都能理解你的意思,但有些人对这两者在含义上的区别持有强烈的看法。关键在于,这可能会让试图帮助你的人感到困惑。在描述问题时,请尽可能精准。

如果可能,请尽量将无法运行的部分简化为一个简单的可复现示例。如果你能使用一个非常小的数据框而非那个 50000 行 10000 列的数据框来复现问题,请在提供问题描述的同时,附上该小数据框。在适当的情况下,请尝试将操作内容泛化,以便非同行也能理解你的问题。例如,不要使用真实数据集的子集,而是创建一个小型(3 列, 5 行)的通用数据集。有关如何编写可复现示例的更多信息,请参阅 Hadley Wickham 的这篇文章。

若要与他人共享对象,且该对象相对较小,可以使用 dput() 函数。它将输出 R 代码,可用于还原与内存中完全相同的对象:

R

## iris is an example data frame that comes with R and head() is a
## function that returns the first part of the data frame
dput(head(iris))

输出

structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4),
    Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 3.9), Petal.Length = c(1.4,
    1.4, 1.3, 1.5, 1.4, 1.7), Petal.Width = c(0.2, 0.2, 0.2,
    0.2, 0.2, 0.4), Species = structure(c(1L, 1L, 1L, 1L, 1L,
    1L), levels = c("setosa", "versicolor", "virginica"), class = "factor")), row.names = c(NA,
6L), class = "data.frame")

如果对象较大,请提供原始文件(即您的 CSV 文件)以及直到出现错误为止的脚本(并删除所有与问题无关的内容)。或者,特别是当您的问题与数据框无关时,您可以将任何 R 对象保存到文件中[^export]:

R

saveRDS(iris, file="/tmp/iris.rds")

不过,该文件的内容并非人类可读,无法直接发布在 Stack Overflow 上。相反,可以通过电子邮件发送给他人,对方可以使用 readRDS() 命令将其读取(此处假设下载的文件位于用户主目录下的 Downloads 文件夹中):

R

some_data <- readRDS(file="~/Downloads/iris.rds")

最后但同样重要的一点是,务必附上 sessionInfo() 的输出结果,因为它提供了关于您的平台、所使用的 R 版本和包以及其他对理解您的问题非常有帮助的关键信息。

R

sessionInfo()

输出

R version 4.6.2 (2026-10-29)
Platform: aarch64-apple-darwin23
Running under: macOS Golden Gate 27.2

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1

locale:
[1] C.UTF-8/C.UTF-8/C.UTF-8/C/C.UTF-8/C.UTF-8

time zone: Asia/Tokyo
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] compiler_4.6.2 cli_3.6.6      tools_4.6.2    otel_0.2.0     knitr_1.52
[6] xfun_0.62      rlang_1.3.0    png_0.1-9      evaluate_1.0.5

在哪里寻求帮助?

  • 课程期间坐在你身边的人。在工作坊期间,请随时与邻座交流,比对答案并寻求帮助。
  • 你的友好同事:如果你认识比你经验更丰富的人,他们可能能够且愿意帮助你。
  • Stack Overflow:如果你的问题此前尚未得到解答且表述得当,很有可能在 5 分钟内就能获得答案。记得遵循其关于如何提问的指南。
  • R-help 邮件列表:这里有很多人在阅读(包括大多数 R 核心团队成员),发帖的人也很多,但语气可能相当枯燥,且并不总是对新用户非常友好。如果你的问题合理,很可能会很快得到回复,但不要指望回复中会出现笑脸符号。此外,在这里比在任何其他地方都更需要确保使用正确的词汇(否则你得到的回复可能会指出你的用词错误,而不是直接回答你的问题)。如果你的问题是关于基础函数而非特定包,成功率也会更高。
  • 如果您的问题涉及某个特定包,请查看是否有相应的邮件列表。通常该信息包含在包的 DESCRIPTION 文件中,可以通过 packageDescription("name-of-package") 访问。您也可以尝试直接发送电子邮件给该包的作者,或者在代码仓库(例如 GitHub)中提交一个 issue。
  • 此外,还有一些特定主题的邮件列表(GIS、系统发育等……),完整列表可在 R-project 邮件列表页面 查看。

更多资源

R 包


加载包

如上所述,R 包在 R 中发挥着至关重要的作用。若要使用某个包的功能(前提是该包已安装),我们首先需要将其加载才能使用。这可以通过 library() 函数实现。下面,我们加载 ggplot2。

R

library("ggplot2")

安装包

默认的包仓库是 Comprehensive R Archive Network (CRAN),任何在 CRAN 上可用的包都可以使用 install.packages() 函数安装。下面,例如,我们将安装稍后将要学习的 dplyr 包。

R

install.packages("dplyr")

此命令将安装 dplyr 包及其所有依赖项,即该包运行所依赖的所有包。

另一个主要的 R 包仓库由 Bioconductor 维护。Bioconductor 包 通过一个专用包——即 BiocManager 进行管理和安装,该包可从 CRAN 安装,使用

R

install.packages("BiocManager")

随后,可以使用 BiocManager::install 安装单个包,例如 SummarizedExperiment(稍后将使用)、DESeq2(用于 RNA-Seq 分析),以及来自 Bioconductor 或 CRAN 的任何其他包。

R

BiocManager::install("SummarizedExperiment")
BiocManager::install("DESeq2")

默认情况下,BiocManager::install() 还会检查所有已安装的包,查看是否有更新版本。如果有,它会向您显示这些版本,并询问您是否要 Update all/some/none? [a/s/n]:,然后等待您的回答。虽然您应当尽量保持包版本为最新,但在实践中,我们建议仅在启动新的 R 会话且尚未加载任何包之前更新包。

要点
  • 开始使用 R 和 RStudio
Noble, William Stafford. 2009. “A Quick Guide to Organizing Computational Biology Projects.” PLOS Computational Biology 5 (7): 1–5. https://doi.org/10.1371/journal.pcbi.1000424.

  1. 与直接在命令行控制台使用 R 不同。虽然还有其他能与 R 对接并集成的软件,但 RStudio 特别适合初学者,同时还提供了许多非常高级的功能。↩︎

  2. 即赋予 R 新功能的附加组件,例如生物信息学数据分析。↩︎

  3. 在本课程中,我们将生物信息学视为应用于生物或生物医学数据的数据科学。↩︎

  4. 那个人可能是,而且极有可能就是你在分析运行几个月或几年后的未来自己。↩︎

  5. 我们将在此介绍其中的大部分内容(统计学除外),但仅能触及 R 所能实现的丰富功能的皮毛。↩︎