《R for Data Science (2e)》免费中文翻译 (第6章) --- scripts and projects

写在前面

本系列推文为《R for Data Science (2)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github,欢迎大家参与贡献,详细信息见:
Books-zh-cn 项目介绍:
Books-zh-cn:开源免费的中文书籍社区
r4ds-zh-cn Github 地址:
https://github.com/Books-zh-cn/r4ds-zh-cn
r4ds-zh-cn 网站地址:
https://books-zh-cn.github.io/r4ds-zh-cn/


目录

  • 6.1 脚本

  • 6.2 项目

  • 6.3 练习

  • 6.4 总结

本章将向您介绍组织代码的两个基本工具:脚本(scripts)和项目(projects)。

6.1 脚本

到目前为止,您已经使用控制台(console)来运行代码。这是一个很好的起点,但是当您创建更复杂的 ggplot2 图形和更长的 dplyr 管道时,您会发现它很快就会变得拥挤。为了给自己更多的工作空间,请使用脚本编辑器。单击 File 菜单,选择 New File,然后选择 R script,或使用键盘快捷键 Cmd/Ctrl + Shift + N 将其打开。现在您将看到四个窗格,如 Figure 6.1 所示。脚本编辑器是试验代码的好地方。当您想要更改某些内容时,不必重新输入整个内容,只需编辑脚本并重新运行即可。一旦您编写了可以运行并执行您想要的操作的代码,您就可以将其保存为脚本文件,以便稍后轻松返回。

 

Figure 6.1: 打开脚本编辑器会在 IDE 的左上角添加一个新窗格。

6.1.1 运行代码

脚本编辑器是构建复杂 ggplot2 绘图或长序列 dplyr 操作的绝佳场所。有效使用脚本编辑器的关键是记住最重要的键盘快捷键之一:Cmd/Ctrl + Enter。这将在控制台中执行当前的 R 表达式。例如,采用下面的代码。

library(dplyr)
library(nycflights13)not_cancelled <- flights |> filter(!is.na(dep_delay)█, !is.na(arr_delay))not_cancelled |> group_by(year, month, day) |> summarize(mean = mean(dep_delay))

如果光标位于 █ 处,按 Cmd/Ctrl + Enter 将运行生成 not_cancelled 的完整命令。它还会将光标移动到以下语句(以 not_cancelled |> 开头)。这样可以通过重复按 Cmd/Ctrl + Enter 轻松地逐步执行完整的脚本。

您还可以使用 Cmd/Ctrl + Shift + S 一步执行完整的脚本,而不是逐个表达式地运行代码。定期执行此操作是确保您捕获脚本中代码的所有重要部分的好方法。

我们建议您始终使用所需的包来启动脚本。这样,如果您与其他人共享代码,他们可以轻松查看需要安装哪些软件包。但请注意,您绝对不应该在共享的脚本中包含 install.packages()。如果他们不小心的话,交出一个会改变他们计算机上某些内容的脚本是不体贴的!

在学习后续章节时,我们强烈建议从脚本编辑器开始并练习键盘快捷键。随着时间的推移,以这种方式向控制台发送代码将变得如此自然,您甚至不会想到它。

6.1.2 RStudio 诊断

在脚本编辑器中,RStudio 将使用红色波浪线和侧边栏中的十字来突出显示语法错误:

 

将鼠标悬停在十字上即可查看问题所在:

 

RStudio 还会让您了解潜在的问题:

 

6.1.3 保存和命名

当您退出时,RStudio 会自动保存脚本编辑器的内容,并在您重新打开时自动重新加载。尽管如此,最好避免使用 Untitled1、Untitled2、Untitled3 等,而是保存脚本并为它们提供信息丰富的名称。

将文件命名为 code.Rmyscript.R 可能很诱人,但在为文件选择名称之前应该仔细考虑一下。文件命名的三个重要原则如下:

  1. 文件名应该是机器可读的(machine readable):避免空格、符号和特殊字符。不要依靠大小写来区分文件。

  2. 文件名应该是人类可读的(human readable):使用文件名来描述文件中的内容。

  3. 文件名应该与默认顺序配合良好:以数字开头的文件名,以便按字母顺序排序将它们按照使用的顺序排列。

例如,假设项目文件夹中有以下文件。

alternative model.R
code for exploratory analysis.r
finalreport.qmd
FinalReport.qmd
fig 1.png
Figure_02.png
model_first_try.R
run-first.r
temp.txt

这里存在各种各样的问题:很难找到先运行哪个文件、文件名包含空格、有两个同名但大小写不同的文件(finalreport vs. FinalReport)、有些名称没有描述其内容(run-first and temp)。

这是命名和组织同一组文件的更好方法:

01-load-data.R
02-exploratory-analysis.R
03-model-approach-1.R
04-model-approach-2.R
fig-01.png
fig-02.png
report-2022-03-20.qmd
report-2022-04-02.qmd
report-draft-notes.txt

对关键脚本进行编号可以清楚地显示运行它们的顺序,并且一致的命名方案可以更容易地看到差异。此外,数字的标签类似,报告通过文件名中包含的日期进行区分,并且 temp 被重命名为 report-draft-notes 以更好地描述其内容。如果一个目录中有很多文件,建议进一步组织,将不同类型的文件(scripts, figures, etc.)放在不同的目录中。

6.2 项目

有一天,您需要退出 R,去做其他事情,然后再返回分析。有一天,您将同时进行多项分析,并且希望将它们分开。有一天,您需要将外部世界的数据引入 R,并将 R 中的数值结果和数字发送回外部世界。

为了处理这些现实生活中的情况,您需要做出两个决定:

  1. 真实来源是什么?您将保存什么作为所发生事件的永久记录?

  2. 您的分析在哪里?

6.2.1 真实的来源是什么?

作为初学者,可以依赖当前的环境来包含您在分析过程中创建的所有对象。但是,为了更轻松地处理大型项目或与其他人协作,您的真实来源应该是 R scripts。使用 R scripts(和数据文件),您可以重新创建环境。仅在您的环境中,重新创建 R scripts 要困难得多:您要么必须从内存中重新输入大量代码(一路上不可避免地会犯错误),要么必须仔细挖掘您的 R history。

为了帮助将 R scripts 保留为分析的真实来源,我们强烈建议您指示 RStudio 不要在会话之间保留工作区。您可以通过运行 usethis::use_blank_slate()Figure 6.2 中所示的选项来完成此操作。这会给您带来一些短期的痛苦,因为现在当您重新启动 RStudio 时,它将不再记住您上次运行的代码,也不会再使用您创建的对象或读取的数据集。但这种短期的痛苦可以避免长期的痛苦,因为它迫使您捕获代码中的所有重要过程。没有什么比三个月后发现您只将重要计算的结果存储在环境中,而不是计算本身存储在代码中更糟糕的了。

 

Figure 6.2: 将这些选项复制到你的 RStudio 选项中,以便始终从头开始启动 RStudio 会话。

有一对很棒的键盘快捷键可以协同工作,以确保您在编辑器中捕获了代码的重要部分:

  1. 按 Cmd/Ctrl + Shift + 0/F10 重新启动 R。

  2. 按 Cmd/Ctrl + Shift + S 重新运行当前脚本。

我们每周都会使用这种模式数百次。

或者,如果您不使用键盘快捷键,则可以转到 Session > Restart R,然后突出显示并重新运行当前脚本。

RStudio server

如果您使用 RStudio server,默认情况下您的 R 会话永远不会重新启动。当您关闭 RStudio server 选项卡时,可能感觉您正在关闭 R,但服务器实际上让它在后台运行。下次您返回时,您将位于与离开时完全相同的位置。这使得定期重新启动 R 变得更加重要,这样您才能从头开始。

6.2.2 您的分析位置在哪里?

R 有一个强大的工作目录(working directory)概念。这是 R 查找您要求其加载的文件的位置,也是放置您要求其保存的任何文件的位置。RStudio 在控制台顶部显示您当前的工作目录:

 

您可以通过运行 getwd() 在 R 代码中打印出来:

getwd()
#> [1] "/Users/hadley/Documents/r4ds"

在此 R 会话中,当前工作目录(将其视为"home")位于 hadley 的 Documents 文件夹中名为 r4ds 的子文件夹中。当您运行此代码时,它会返回不同的结果,因为您的计算机的目录结构与 Hadley 的不同!

作为 R 初学者,可以将工作目录设置为主目录、文档目录或计算机上任何其他奇怪的目录。但你已经读了这本书的七章,并且你不再是初学者了。很快您就应该将项目组织到目录中,并且在处理项目时将 R 的工作目录设置为关联的目录。

您可以在 R 中设置工作目录,但我们不推荐这样做:

setwd("/path/to/my/CoolProject")

有一个更好的方法;这种方式还可以让您像专家一样管理您的 R 工作。就是 RStudio project

6.2.3 RStudio projects

将与给定项目关联的所有文件(input data, R scripts, analytical results, and figures)保存在一个目录中是一种明智且常见的做法,RStudio 通过项目(projects)对此提供了内置支持。让我们创建一个 project 供您在学习本书其余部分时使用。单击 File > New Project,然后按照 Figure 6.3 中所示的步骤操作。

 

Figure 6.3: 要创建 new project:(top)首先单击 New Directory,然后(middle)单击 Create Project,然后(bottom)填写目录(project)名称,选择一个好的子目录作为其主目录,然后单击 Create Project。

将您的项目命名为 r4ds,并仔细考虑将项目放在哪个子目录中。如果您不将其存储在合理的地方,将来将很难找到它!

此过程完成后,您将获得一个专门用于本书的新 RStudio 项目。检查项目的 "home" 是否是当前工作目录:

getwd()
#> [1] /Users/hadley/Documents/r4ds

现在在脚本编辑器中输入以下命令,然后保存文件,将其命名为 "diamonds.R"。然后,创建一个名为 "data" 的新文件夹。您可以通过单击 RStudio Files 窗格中的 "New Folder" 按钮来完成此操作。最后,运行完整的脚本,将 PNG 和 CSV 文件保存到您的项目目录中。不用担心细节,你会在本书后面学到它们。

library(tidyverse)ggplot(diamonds, aes(x = carat, y = price)) + geom_hex()
ggsave("diamonds.png")write_csv(diamonds, "data/diamonds.csv")

退出 RStudio。检查与您的项目关联的文件夹 --- 注意 .Rproj 文件。双击该文件以重新打开该项目。请注意,您回到了上次离开的位置:它是相同的工作目录和命令历史记录,并且您正在处理的所有文件仍然打开。然而,由于您遵循了我们上面的说明,因此您将拥有一个全新的环境,保证您从头开始。

以您最喜欢的特定于操作系统的方式,在计算机中搜索 diamonds.png,您会找到 PNG(毫不奇怪),而且还会找到创建它的脚本(diamonds.R)。这是一个巨大的胜利!有一天,您会想要重新制作一个人物,或者只是想了解它的来源。如果您使用 R 代码严格地将图形保存到文件中,而不是使用鼠标或剪贴板,那么您将能够轻松地重现旧作品!

6.2.4 相对和绝对路径

一旦进入项目,您应该只使用相对路径而不是绝对路径。有什么不同?相对路径是相对于工作目录的,即项目的主目录。当 Hadley 在上面写入 data/diamonds.csv 时,它是 /Users/hadley/Documents/r4ds/data/diamonds.csv 的快捷方式。但重要的是,如果 Mine 在她的计算机上运行此代码,它将指向 /Users/Mine/Documents/r4ds/data/diamonds.csv。这就是为什么相对路径很重要:无论 R 项目文件夹位于何处,它们都会起作用。

无论您的工作目录如何,绝对路径都指向同一位置。根据您的操作系统,它们看起来略有不同。在 Windows 上,它们以驱动器号(例如 C:)或两个反斜杠(例如 \\servername)开头,在 Mac/Linux 上,它们以斜杠"/"开头(例如 /users/hadley)。您永远不应该在脚本中使用绝对路径,因为它们会妨碍共享:其他人不会拥有与您完全相同的目录配置。

操作系统之间还有另一个重要的区别:如何分离路径的组成部分。Mac 和 Linux 使用斜杠(例如 data/diamonds.csv),Windows 使用反斜杠(例如 data\diamonds.csv)。R 可以使用任何一种类型(无论您当前使用什么平台),但不幸的是,反斜杠对 R 来说意味着一些特殊的东西,并且要在路径中获得单个反斜杠,您需要键入两个反斜杠!这让生活变得令人沮丧,因此我们建议始终使用带有正斜杠的 Linux/Mac 风格。

6.3 练习

  1. 转到 RStudio Tips Twitter account,https://twitter.com/rstudiotips 并找到一个看起来有趣的提示。练习使用它!

  2. RStudio 诊断还会报告哪些其他常见错误?阅读 https://support.posit.co/hc/en-us/articles/205753617-Code-Diagnostics 找出。

6.4 总结

在本章中,您学习了如何在 scripts (files) 和 projects (directories) 中组织 R 代码。 就像代码风格一样,一开始这可能感觉像是在忙活。但是,当您在多个项目中积累更多代码时,您将学会欣赏一点预先的组织如何可以为您节省大量时间。

总之,scripts 和 projects 为您提供了可靠的工作流程,将在未来为您提供良好的服务:

  • 为每个数据分析项目创建一个 RStudio project。

  • 将脚本(具有信息丰富的名称)保存在项目中,对其进行编辑,部分或整体运行它们。经常重新启动 R 以确保您已捕获脚本中的所有内容。

  • 只使用相对路径,而不是绝对路径。

然后,您需要的所有内容都集中在一处,并与您正在处理的所有其他项目完全分开。

到目前为止,我们已经使用了 R 包中捆绑的数据集。这样可以更轻松地对预先准备的数据进行一些练习,但显然您的数据无法以这种方式获得。因此,在下一章中,您将学习如何使用 readr 包将数据从磁盘加载到 R 会话中。

 

--------------- 本章结束 ---------------

 

本期翻译贡献:

  • @TigerZ生信宝库

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97470.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub Spark深度体验:是革命前夜,还是又一个“大厂玩具”?

最近&#xff0c;AI 编码工具层出不穷&#xff0c;几乎每天都有新概念诞生。而当 GitHub 这样的行业巨头携“Vibe Coding”概念入场时&#xff0c;所有开发者的期待值都被瞬间拉满。GitHub Spark&#xff0c;一个承诺能用自然语言将你的想法直接变成全栈应用的工具&#xff0c;…

科学研究系统性思维的方法体系:研究设计相关模版

一、研究设计方案模板 模板说明本模板基于《研究设计原理与方法》深度解读报告的理论框架&#xff0c;帮助研究者制定系统性的研究设计方案。模板整合了因果推断理论、效度控制框架和现代实验设计原理。1. 研究问题界定与假设陈述 1.1 研究问题核心要素 研究问题&#xff08;明…

法律审查prompt收集

当前DeepSeek等大模型已经具备初步合同审查能力。 这里收集合同审查及相关prompt&#xff0c;不管是做Coze等Agent&#xff0c;还是开发LLM应用&#xff0c;都有可能用到这些prompt。 https://github.com/LeeXYZABC/law_propmpts.git 1 条款分析 system_prompt&#xff0c;L…

贪心算法解决活动选择问题:最多不重叠活动数量求解

题目描述问题背景活动选择问题是贪心算法的经典应用场景之一。假设有若干个活动&#xff0c;每个活动都有独立的开始时间和结束时间&#xff0c;且同一时间只能进行一个活动。要求从这些活动中选择出最大数量的不重叠活动&#xff0c;即任意两个选中的活动&#xff0c;前一个活…

2025年如何批量下载雪球帖子和文章导出pdf?

之前分享过雪球文章下载 2025 批量下载市场高标解读/配置喵/wangdizhe 雪球帖子/文章导出excel和pdf 这里以市场高标解读这个号为例 抓取下载的所有帖子excel数据包含文章日期&#xff0c;文章标题&#xff0c;文章链接&#xff0c;文章简介&#xff0c;点赞数&#xff0c;转…

【C++】红黑树(详解)

文章目录上文链接一、什么是红黑树二、红黑树的性质1. 颜色规则2. 红黑树的规则为什么可以控制平衡3. 红黑树的效率三、红黑树的整体结构四、红黑树的插入1. 空树的插入2. 插入节点的父亲为黑色3. 插入节点的父亲为红色(1) 叔叔为红色&#xff1a;变色(2) 叔叔为空或为黑色&…

AI提升SEO关键词效果新策略

内容概要 在2025年&#xff0c;人工智能&#xff08;AI&#xff09;技术正全面革新搜索引擎优化&#xff08;SEO&#xff09;的关键词优化模式。通过智能分析用户搜索意图与语义关联&#xff0c;AI能够精准匹配关键词并进行高效布局。本文将深入探讨AI驱动的关键词策略升级方案…

手动安装的node到nvm吧版本管理的过程。

前言 本文记录个人在使用nvm包管理器安装node 14版本 npm安装失败&#xff0c;进行手动安装的node到nvm吧版本管理的过程。 安装node 14 时 npm总是安装失败&#xff0c;如下图 通过手动下载对于版本 node下载地址 下载解压点击所需的版本下载后解压 修改解压后的文件夹名称…

Python爬虫实战:构建Widgets 小组件数据采集和分析系统

1. 引言 1.1 研究背景 在当今数字化时代,Widgets 作为用户界面的基本组成元素,广泛应用于移动应用、网站和桌面软件中,其设计质量直接影响用户体验。随着市场竞争的加剧,了解市场上各类 Widgets 产品的特征、价格区间、用户评价等信息,对于产品设计和商业决策具有重要价…

1.1 Internet简介

1.网络, 计算机网络, 互联网 2.不同的角度认识Internet1.网络, 计算机网络, 互联网 网络表示连接两点以上的通路系统比如:a.你家到邻居家的小路 -> 一个小网络b.一个村子的所有道路 -> 一个更大的网络c.送外卖的小哥骑车走的路线 -> 一个配送网络计算机网络表示专门传…

pytest使用allure测试报告

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 选用的项目为Selenium自动化测试Pytest框架实战&#xff0c;在这个项目的基础上说allure报告。 allure安装 首先安装python的allure-pytest包 pip install allu…

PortSwigger靶场之SQL injection with filter bypass via XML encoding通关秘籍

一、题目分析该实验室的库存查询功能存在 SQL 注入漏洞。查询结果为这些信息会出现在应用程序的响应中&#xff0c;因此您可以利用“联合”攻击来从其他表中获取数据。该数据库中有一个“用户”表&#xff0c;该表包含了已注册用户的用户名和密码。要解决&#xff0c;需进行一次…

Cocos游戏中自定义按钮组件(BtnEventComponent)的详细分析与实现

概述在Cocos游戏开发中&#xff0c;按钮交互是用户界面中最基础且重要的组成部分。原生的Cocos Button组件虽然功能完善&#xff0c;但在复杂的游戏场景中往往无法满足多样化的交互需求。本文将详细分析一个功能强大的按钮组件BtnEventComponent&#xff0c;它提供了多种交互模…

终于完成William F. Egan所著的Practical RF System Design的中文版学习资料

终于完成William F. Egan所著的Practical RF System Design的中文版学习资料 该文档聚焦RF系统的分析与设计。书中先介绍系统设计流程、书籍结构及工具&#xff08;如电子表格、测试与仿真&#xff09;&#xff0c;接着围绕RF系统关键参数展开&#xff1a;讲解增益计算&#xf…

嵌入式Linux驱动开发:蜂鸣器驱动

嵌入式Linux驱动开发&#xff1a;蜂鸣器驱动 1. 引言 本文档详细记录了基于i.MX6ULL处理器的蜂鸣器驱动开发过程。内容涵盖驱动的理论基础、代码实现、设备树配置以及用户空间应用程序的编写。本文档严格遵循用户提供的代码和文档&#xff0c;确保理论与实践的紧密结合。本文档…

Qt中的锁和条件变量和信号量

Qt中的锁和条件变量和信号量 C11中引入智能指针用来解决锁忘记释放的问题 代码如下&#xff1a; void Thread::run() {for(int i0;i<50000;i){QMutexLocker locker(&mutex);//mutex.lock();num;//mutex.unlock();} }大括号结束的时候&#xff0c;生命周期踩结束&#xf…

智能电视MaxHub恢复系统

公司的MaxHub智能电视又出故障了。 去年硬件故障返厂&#xff0c;花了8600多元。 这次看上去是软件故障。开机后蓝屏报错。 按回车键&#xff0c;电视重启。 反复折腾几次&#xff0c;自行修复执行完毕&#xff0c;终于可以进入系统了。 只不过进入windows10后&#xff0c;图…

TensorFlow 面试题及详细答案 120道(71-80)-- 性能优化与调试

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 71. 如何优化TensorFlow模…

数据结构 第三轮

以看严蔚敏老师的教材为主&#xff0c;辅以其他辅导书&#xff1a;王道&#xff0c;新编数据结构&#xff0c;学校讲义 线性结构&#xff1a;线性表、串、队列、栈、数组和广义表 树形结构、网状结构&#xff1a;图 查找、排序 动态内存管理和文件 绪论 8-29 数据&#xf…

[新启航]新启航激光频率梳 “光量子透视”:2μm 精度破除遮挡,完成 130mm 深孔 3D 建模

摘要&#xff1a;本文介绍新启航激光频率梳的 “光量子透视” 技术&#xff0c;该技术凭借独特的光量子特性与测量原理&#xff0c;以 2μm 精度破除深孔遮挡&#xff0c;成功完成 130mm 深孔的 3D 建模&#xff0c;为深孔三维形态的精确获取提供了创新解决方案&#xff0c;推动…