编程语言 | R代码风格

简介: ​如同写作,写代码也是有代码风格(code style)。不过代码风格和文风不一样,一个人的文风可以随心所欲,代码风格最好是“千篇一律”。它的核心就是:便于阅读。


如同写作,写代码也是有代码风格(code style)。不过代码风格和文风不一样,一个人的文风可以随心所欲,代码风格最好是“千篇一律”。它的核心就是:便于阅读。

如果你的代码风格也要随心所欲,那么多年后,你再回顾你以前写的代码,你心中可能只有一个疑问:

这TMD是谁写!!!

当然别人也是这样想的,所以为了世界和平,请保持你的代码风格符合一定规则。这里,我们学习的是多个知名R包(dplyr, ggplot2)开发者Hadley大神推荐的代码风格。

对象名(Object names)

每次写代码的时候,我总要纠结,这个变量叫啥名字,那个函数又要叫啥名字,于是半天过去了,代码居然一行都没写好。命名比较推荐的是用_分割不同单词,比如说code_style。当然驼峰式命名 codeStyle 也行, 只要保证前后一致。如果你英文水平不错,还可以让变量名都是名词,函数名都是动词。

记住: 千万不要把内置的函数名或变量名用于命名,比如说TRUE <- FALSE。如果你老板对你太狠,你不想干了,倒是可以考虑一下。

合理使用空格

什么叫做合理使用空格呢? 其实就是在所用能用空格的地方都用上空格,比如说

# 反面教材
average<-mean(feet/12+inches,na.rm=TRUE)

完全就可以改成

# 学习模范
average <- mean(feet / 12 + inches, na.rm = TRUE)

前后比较一下,你就会发现后者的阅读更加舒服,没有那么拥挤。但是不要过度, 但是你应该不会这样做。

# 过犹不及
average <- mean ( feet / 12 + inches, na.rm = TRUE )

不过如果是判断语句,比如说if, 那么在 () 前后增加空格就是合理的。

# 反面教材
if(debug)do(x)
plot (x, y)
# 学习模范
if (debug) do(x)
plot(x, y)

关于花括号

我们先看一个反面教材和学习模范的对比:

# 反面教材
if (y < 0 && debug)
message("Y is negative")

if (y == 0)
{ log(x) }
else
{y ^ x}
# 学习模范
if (y < 0 && debug) {
  message("Y is negative")
}
if (y == 0) {
  log(x)
} else {
  y ^ x
}

有没有发现,合理的花括号的使用可以 非常清楚 得找到条件语句中的执行部分,并且代码更容易阅读。简单来说就是如下两点:

  • { 不要独立成行
  • } 尽量独立成行,除非后面紧跟else

每一行的长度

每一行的长度不要超过80个字符,这样子在印刷的时候,可以调整合适的字体大小。什么,你不知道80个字符是多少? 没事,Rstudio可以用 Ctrl + Shift + \ 进行重排。或者每次你觉得自己的代码写的太挤了,就另起一行吧。

每行缩进

千万不要混用Tab和space,甚至就不要用Tab进行缩进, 千万不要,记住千万不要。因为不同系统对Tab所占空白区域是不同的,对于Python而言,混用直接出错。
至于每一行缩进多少就按照你自己喜欢的来,Rstuido默认是2个空格,我觉得挺好看的。

赋值

请用 <- 对变量赋值,不要用=, =仅仅用在函数里面的参数赋值。有一次我看到别人代码里面通篇用=进行赋值,我知道他之前学编程用的是Perl, 所以会把这些习惯带过来。但是既然用了R, 那么爱屋及乌用<-吧!

# 反面教材
x = 123
# 学习模范
x <- 123

PS: 这条不是必须的,但是强烈推荐,这样子别人立马能看出来你写的是R代码。当然我已经能够熟练在Python和R里面切换使用赋值符号了。

请用注释

如果这个代码这辈子都不用第二次了,也不打算给任何人看,那么你不需要写注释。否则,请写上你的注释,并且保证你的注释有意义,也就是解释你为什么要写这行代码,而不只是说这行代码干了什么

## 反面教材
# 往屏幕输出"hello world"
print("hello world")
## 学习模范
# 为了让初学者体验编码非常简单,用"hello world"的方式和计算机交互
print("hello world")

最后,如果你已经写了大量风格迥异的代码,不想一个个修改怎么办?好在谢益辉大神写了fromatR帮助我们调整编码风格:

# install.packages("formatR")
# 用法
formatR::tidy_dir("R")

这个包主要完成了如下内容,基本上完全按照代码风格修改:

  • 单行代码和注释过长会被重新组织成多行,更加容易阅读
  • 尽可能地增加空格和缩进
  • 大多数情况下会保留注释
  • 缩进默认空格为4个, 但是可以修改
  • 单行无}的else会被放回前一行
  • 赋值操作的=会被替换成<-, 函数参数中=不在考虑范围内
  • { 可以移到新的一行中。
    当然谢益辉大神在博客(地址为https://yihui.name/formatr/)里也详细接好了formatR
    注: 还可以用linter可以在写代码时检查潜在问题。
目录
相关文章
|
算法 测试技术 API
如何用Ruby语言提高代码的可读性和可维护性
在软件开发过程中,代码的可读性和可维护性是非常重要的因素。一旦代码变得难以理解和修改,就会导致开发速度变慢、bug增多以及团队合作效率下降。在本篇博客中,我们将探讨一些使用Ruby编程语言的技巧和最佳实践,以提高代码的可读性和可维护性。
94 1
|
9天前
|
存储 算法 开发者
揭秘编程语言的魔法:从代码到计算机理解
编程,一种将思维转化为指令的艺术。本文将带你走进编程语言的世界,探索如何将简单的代码变成计算机能够理解的指令。我们将通过Python语言的例子,展示变量、数据类型、控制结构等基本概念,并解释它们是如何被计算机执行的。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。让我们一起揭开编程语言的神秘面纱,看看那些我们每天使用的代码是如何在计算机中运行的。
|
5月前
|
人工智能 Java C#
理解编程语言的类型系统
【7月更文挑战第11天】本文介绍现代软件工程借助形式化方法确保系统正确性。强类型系统如数理逻辑虽能表达普遍属性但复杂,轻量级技术如模型检查(用于芯片设计和通信协议验证)和类型系统则更易用。类型系统是推理工具,起源于解决逻辑悖论,经历多个里程碑发展,分为动态和静态分支,重点在于编程语言应用,特别是AI领域。
65 2
理解编程语言的类型系统
|
7月前
|
程序员 编译器 C++
|
7月前
|
存储 算法 测试技术
|
JavaScript 编译器 开发者
初学者简单理解 TypeScript 类型系统
TypeScript 是一种强类型的编程语言,具有强大的类型系统。了解和掌握 TypeScript 的类型系统是成为高效 TypeScript 开发者的关键。本文将深入探讨 TypeScript 类型系统的核心概念和用法。
初学者简单理解 TypeScript 类型系统
|
Rust Dart JavaScript
每个开发人员都想使用的编程语言
每个开发人员都想使用的编程语言
|
算法 编译器 程序员
代码规范:其它编程经验
【建议 11-3-4】当心数据类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事),避免让编译器轻悄悄地进行隐式的数据类型转换。
67 0
|
编译器 C++
【C++】实用编程规范与建议
C++ 相关,比较实用的 防止疏漏出错的编码规范与编码建议
191 0