《R for Data Science (2e)》免费中文翻译 (第4章) --- Workflow: code style

写在前面

本系列推文为《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/


目录

  • 4.1 命名

  • 4.2 空格

  • 4.3 管道

  • 4.4 ggplot2

  • 4.5 分段注释

  • 4.6 练习

  • 4.7 总结

良好的编码风格就像正确的标点符号:你可以不用它来管理,但它肯定会让事情更容易阅读。即使作为一个非常新的程序员,研究您的代码风格也是一个好主意。使用一致的风格可以让其他人(包括未来的你!)更容易阅读你的作品,如果你需要从别人那里获得帮助,这一点尤为重要。本章将介绍整本书中使用的 tidyverse style guide 的最重要的要点。

设计代码样式一开始会觉得有点乏味,但如果你练习它,它很快就会成为第二天性。此外,还有一些很棒的工具可以快速重新设计现有代码的样式,例如 Lorenz Walthert 的 styler 包。使用 install.packages("styler") 安装后,使用它的一种简单方法是通过 RStudio 的命令面板(command palette)。命令面板允许您使用任何内置的 RStudio 命令和包提供的许多插件。按 Cmd/Ctrl + Shift + P 打开调色板,然后键入 “styler” 以查看 styler 提供的所有快捷方式。Figure 4.1 显示了结果。

 

Figure 4.1:Rstudio 的命令面板使仅使用键盘访问每个 RStudio 命令变得易于使用。

在本章中,我们将使用 tidyverse 和 nycflights13 包作为代码示例。

library(tidyverse)
library(nycflights13)

4.1 命名

我们在 Section 2.3 中简要讨论了命名(names)。请记住,变量名(由 <- 创建的和由 mutate() 创建的)应仅使用小写字母、数字和 _。使用 _ 分隔名称中的单词。

# Strive for:
short_flights <- flights |> filter(air_time < 60)# Avoid:
SHORTFLIGHTS <- flights |> filter(air_time < 60)

作为一般经验法则,最好选择易于理解的长描述性名称,而不是快速键入的简洁名称。短名称在编写代码时节省的时间相对较少(尤其是因为自动完成功能会帮助您完成输入),但当您返回旧代码并被迫拼出一个神秘的缩写时,它可能会很耗时。

如果您有一堆相关事物的名称,请尽量保持一致。当您忘记以前的约定时很容易出现不一致,所以如果您不得不返回并重命名事物,请不要难过。一般来说,如果你有一堆变量是同一个主题的变体,你最好给它们一个共同的前缀而不是一个共同的后缀,因为自动完成在变量的开头效果最好。

4.2 空格

除了 ^(即 +-==<、...)和赋值运算符 (<-) 外,在数学运算符的两边放置空格。

# Strive for
z <- (a + b)^2 / d# Avoid
z<-( a + b ) ^ 2/d

不要在常规函数调用的括号内或括号外放置空格。总是在逗号后加一个空格,就像标准英语一样。

# Strive for
mean(x, na.rm = TRUE)# Avoid
mean (x ,na.rm=TRUE)

如果可以改善对齐方式,可以添加额外的空格。例如,如果您在 mutate() 中创建多个变量,您可能需要添加空格以便所有 = 排成一行。这样可以更轻松地浏览代码。

flights |> mutate(speed      = distance / air_time,dep_hour   = dep_time %/% 100,dep_minute = dep_time %%  100)

4.3 管道

|> 前面应该始终有一个空格,并且通常应该放在一行的最后。这使得添加新步骤、重新排列现有步骤、修改步骤中的元素以及通过浏览左侧的 verbs 获得 10,000 英尺的视图变得更加容易。

# Strive for 
flights |>  filter(!is.na(arr_delay), !is.na(tailnum)) |> count(dest)# Avoid
flights|>filter(!is.na(arr_delay), !is.na(tailnum))|>count(dest)

如果您要输入的函数具有命名参数(如 mutate()summarize()),请将每个参数放在一个新行中。如果函数没有命名参数(如 select()filter()),请将所有内容放在一行中,除非它不适合,在这种情况下,您应该将每个参数放在自己的行中。

# Strive for
flights |>  group_by(tailnum) |> summarize(delay = mean(arr_delay, na.rm = TRUE),n = n())# Avoid
flights |>group_by(tailnum) |> summarize(delay = mean(arr_delay, na.rm = TRUE), n = n())

在流水线的第一步之后,每行缩进两个空格。RStudio 会在 |> 后的换行符后自动为您添加空格。如果您将每个参数放在自己的行中,请额外缩进两个空格。确保 ) 独占一行,并且未缩进以匹配函数名称的水平位置。

# Strive for 
flights |>  group_by(tailnum) |> summarize(delay = mean(arr_delay, na.rm = TRUE),n = n())# Avoid
flights|>group_by(tailnum) |> summarize(delay = mean(arr_delay, na.rm = TRUE), n = n())# Avoid
flights|>group_by(tailnum) |> summarize(delay = mean(arr_delay, na.rm = TRUE), n = n())

如果您的管道很容易放在一条线上,那么可以避开其中一些规则。 但根据我们的集体经验,短片段变长是很常见的,因此从长远来看,从所需的所有垂直空间开始通常会节省时间。

# This fits compactly on one line
df |> mutate(y = x + 1)# While this takes up 4x as many lines, it's easily extended to 
# more variables and more steps in the future
df |> mutate(y = x + 1)

最后,要小心写很长的管道,比如超过 10-15 行。试着把它们分解成更小的子任务,给每个任务一个信息丰富的名称。这些名称将有助于提示读者了解正在发生的事情,并更容易检查中间结果是否符合预期。每当你可以给一些东西一个信息性名称时,你应该给它一个信息性名称,例如当你从根本上改变数据的结构时,例如,在旋转或总结之后。不要指望第一次就做对!这意味着如果存在可以获得好名字的中间状态,则打破长管道。

4.4 ggplot2

适用于管道的相同基本规则也适用于 ggplot2;只需将 + 视为与 |> 相同的方式。

flights |> group_by(month) |> summarize(delay = mean(arr_delay, na.rm = TRUE)) |> ggplot(aes(x = month, y = delay)) +geom_point() + geom_line()

同样,如果您不能将函数的所有参数放在一行中,请将每个参数放在其自己的行中:

flights |> group_by(dest) |> summarize(distance = mean(distance),speed = mean(distance / air_time, na.rm = TRUE)) |> ggplot(aes(x = distance, y = speed)) +geom_smooth(method = "loess",span = 0.5,se = FALSE, color = "white", linewidth = 4) +geom_point()

注意从 |>+ 的过渡。我们希望这种转换不是必需的,但不幸的是,ggplot2 是在发现管道之前编写的。

4.5 分段注释

随着您的脚本变长,您可以使用 sectioning 注释将您的文件分解成可管理的部分:

# Load data --------------------------------------# Plot data --------------------------------------

RStudio 提供了一个键盘快捷键来创建这些标题(Cmd/Ctrl + Shift + R),并将它们显示在编辑器左下角的代码导航下拉列表中,如 Figure 4.2 所示。

 

Figure 4.2: 将分段注释添加到脚本后,您可以在脚本编辑器的左下方使用代码导航工具轻松导航到它们。

4.6 练习

  1. 按照上述指南重新设计以下管道。

    flights|>filter(dest=="IAH")|>group_by(year,month,day)|>summarize(n=n(),
    delay=mean(arr_delay,na.rm=TRUE))|>filter(n>10)flights|>filter(carrier=="UA",dest%in%c("IAH","HOU"),sched_dep_time>
    0900,sched_arr_time<2000)|>group_by(flight)|>summarize(delay=mean(
    arr_delay,na.rm=TRUE),cancelled=sum(is.na(arr_delay)),n=n())|>filter(n>10)
    

4.7 总结

在本章中,您学习了代码风格的最重要原则。从这些开始可能感觉像是一组任意规则(因为它们确实如此!),但随着时间的推移,随着您编写更多代码并与更多人共享代码,您会发现一致的风格是多么重要。并且不要忘记 styler 包:它是快速提高样式不佳代码质量的好方法。

在下一章中,我们将切换回数据科学工具,学习整理数据。Tidy data 是组织数据框的一致方式,在整个 tidyverse 中使用。这种一致性让您的生活更轻松,因为一旦您拥有整洁的数据,它就可以与绝大多数 tidyverse 函数一起使用。当然,生活从来都不是一帆风顺的,您在野外遇到的大多数数据集都不是整洁的。因此,我们还将教您如何使用 tidyr 包来整理您不整洁的数据。


  1. 由于 dep_timeHMMHHMM 格式,我们使用整数除法(%/%)得到 hour,使用余数(也称为取模,%%)得到 minute。

 

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

 

本期翻译贡献:

  • @TigerZ生信宝库

 

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

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

相关文章

11-verilog的RTC驱动代码

verilog的RTC驱动代码 1.例化parameter SLAVE_ADDR 7h51 ; // 器件地址 parameter BIT_CTRL 1b0 ; // 字地址位控制参数(16b/8b) parameter CLK_FREQ 26d50_000_000; // i2c_dri模块的驱动时钟频率(CLK_FREQ) parameter I2C_FR…

【k8s、docker】Headless Service(无头服务)

文章目录问题背景1、什么是Headless Service1.2 为什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行为1.3 验证示例1.4 如何创建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何创建出来的&#xff1f;…

scikit-learn/sklearn学习|套索回归Lasso解读

【1】引言 前序学习进程中&#xff0c;对用scikit-learn表达线性回归进行了初步解读。 线性回归能够将因变量yyy表达成由自变量xxx、线性系数矩阵www和截距bbb组成的线性函数式&#xff1a; y∑i1nwi⋅xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n​wi​⋅xi​bwTxb实…

暴雨服务器:以定制化满足算力需求多样化

在数字经济与实体经济深度融合的浪潮下&#xff0c;互联网行业正经历着前所未有的技术变革。大数据分析、云计算服务、人工智能算法等技术的快速演进&#xff0c;推动着企业对于高性能计算基础设施的需求呈现指数级增长。据IDC数据显示&#xff0c;互联网行业已成为全球服务器采…

JavaScript字符串详解

创建字符串&#xff1a; 1.使用字面量(推荐)&#xff1a; 这是最常用、最直接的方式。你可以用单引号 ()、双引号 (") 或反引号 () 把文本包起来 let singleQuote 单引号; let doubleQuote "双引号"; let templateLiteral 反引号;2.使用String 构造函数&…

Kiro Preview 应用评测

Kiro应用评测 Kiro 是一个由亚马逊推出的 AI 驱动的智能开发环境&#xff0c;从原型到生产全程陪伴您的开发过程。它将"灵感编程"的流畅性与规范的清晰性相结合&#xff0c;帮助您更快地构建更好的软件。 昨天收到了Kiro的试用邮件&#xff0c;收到邮件后第一时间下载…

Flink2.0学习笔记:Flink服务器搭建与flink作业提交

一&#xff0c;下载flink:Downloads | Apache Flink,解压后放入IDE工作目录&#xff1a;我这里以1.17版本为例 可以看到&#xff0c;flink后期的版本中没有提供window启动脚本:start-cluster.bat 所以这里要通过windows自带的wsl 系统启动它 打开终端依次运行下列命令完成w…

MySQL锁的分类

MySQL锁可以按照多个维度进行分类&#xff0c;下面我用最清晰的方式为你梳理所有分类方式&#xff1a;一、按锁的粒度分类&#xff08;最常用分类&#xff09;锁类型作用范围特点适用引擎示例场景表级锁整张表开销小、加锁快&#xff0c;并发度低MyISAM, MEMORY数据迁移、全表统…

电脑上搭建HTTP服务器在局域网内其它客户端无法访问的解决方案

在电脑上开发一套HTTP服务器的程序在调试时&#xff0c;在本机内访问正常&#xff0c;但是在本机外访问就不正常&#xff0c;外部客户端无法访问或无法连接到本机的服务器的问题&#xff0c;这可能涉及网络配置、防火墙、端口转发或服务绑定等问题&#xff0c;在这里提供了解决…

双指针和codetop2(最短路问题BFS)

双指针和codetop21.双指针1.[复写0](https://leetcode.cn/problems/duplicate-zeros/)2.动态规划1.[珠宝的最高价值](https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/)2.[解码方法](https://leetcode.cn/problems/decode-ways/)3.[下降路径最小和](ht…

基于K邻近算法(KNN)的数据回归预测模型

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该MATLAB代码实现了一个基于…

【123页PPT】化工行业数字化解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/91654005 资料解读&#xff1a;【123页PPT】化工行业数字化解决方案 详细资料请看本解读文章的最后内容。化工行业作为国民经济的重要支柱之…

c++--文件头注释/doxygen

文件头注释 开源项目&#xff1a; /*** file robot_base.cpp* author Mr.Wu* date 2025-05-28* version 1.0.0* brief Robot basic drive to communicate with controller** copyright Copyright (c) 2025 google.** Licensed under the Apache License, Version 2.…

【教程】笔记本安装FnOS设置合盖息屏不休眠

重装FnOS好几次了&#xff0c;合盖后屏幕关闭但不休眠的问题每次都要网上找参差不齐的教程&#xff0c;麻烦死了&#xff0c;索性记录一下方便以后复制粘贴。 使用root登录 sudo -i修改系统配置文件编辑logind.conf文件&#xff1a; 打开终端&#xff0c;输入以下命令以编辑log…

深入解析 Monkey OCR:本地化、多语言文本识别的利器与实践指南

在信息爆炸的时代&#xff0c;从图片、扫描文档中高效提取结构化文本的需求日益迫切。OCR&#xff08;光学字符识别&#xff09;技术成为解决这一问题的核心工具。尽管市面上有 Abbyy FineReader、Adobe Acrobat 等商业巨头&#xff0c;以及 Tesseract、PaddleOCR 等开源方案&a…

动态规划法 - 53. 最大子数组和

什么是动态规划法&#xff1f; 简单说&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09; 是一种**「把复杂问题拆解成小问题&#xff0c;通过解决小问题来解决大问题」**的方法。 核心思路有两个&#xff1a; 1.拆分问题&#xff1a;把原问…

STM32CUBEMX配置stm32工程

1.新建工程2.选择芯片3.配置各种片上外设和时钟4.创建工程5.根据文件内容进行修改工程注意&#xff1a;最好根据工程规范来做&#xff0c;因为有时我们需要更改配置并重新生成&#xff0c;如果不按规范来会导致部分代码会被系统清除&#xff0c;在工程中中有很多成对的BEGIN和E…

Day07 缓存商品 购物车

缓存菜品问题说明用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。结果&#xff1a;系统响应慢&#xff0c;用户体验差实现思路通过 Redis 来缓存菜品数据&#xff0c;减少数据库查询操作。缓存逻辑分…

Jenkins(集群与流水线配置)

Jenkins&#xff08;集群与流水线配置&#xff09; Jenkins集群 集群化构建可以提升构建效率&#xff0c;也可以并发在多台机器上执行构建。 安装前提&#xff1a;内存至少512MB、Java 17 以上、Maven环境、Git环境 配置集群步骤 配置节点菜单新建节点查看节点配置状态 新建完节…

深入剖析ROS参数服务器通信机制 ——共享全局数据的“云端仓库”实现原理

​1. 核心概念&#xff1a;分布式数据共享容器​ ​定位​&#xff1a;ROS参数服务器&#xff08;Parameter Server&#xff09;是ROS架构中的全局共享存储系统&#xff0c;相当于机器人的“云端仓库”。 ​作用​&#xff1a; 存储多节点共享的静态配置参数&#xff08;如机器…