R语言 写代码的正确姿势

《Advanced R》 style

良好的编码风格就像使用正确的标点符号。

没有它你也能应付,但它确实让事情更容易阅读。

与标点符号的风格一样,有许多可能的变化。

好的风格很重要。

因为虽然你的代码只有一个作者,但它通常会有多个读者。

当你和别人一起写代码的时候尤其如此。

在这种情况下,最好事先就一个共同的风格达成一致。

Notation and naming 符号和命名

1、File names 文件名

  • 是有意义的
  • 并以 .R 结尾的

如果文件需要按顺序运行,请在它们前面加上数字:

0-download.R

1-parse.R

2-explore.R

2、Object names 对象名称

变量(variable)名和函数(function)名应该是小写。

使用下划线( _ )分隔名称中的单词。

一般来说,变量名应该是名词;

函数名应该是动词。
求其名,求其义

举例:

  • Good:

    day_one

    day_1

  • Bad:

    first_day_of_the_month

    DayOne

    dayone

    djm1

尽可能避免使用现有函数和变量的名称

举例:

  • Bad:
{r} 复制代码
T <- FALSE
c <- 10
mean <- function(x) sum(x)

Syntax 语法

1、Spacing 间距

在所有中缀运算符( = 、 + 、 - 、 <- 等)周围放置空格。

同样的规则也适用于在函数调用中使用 = 。

在逗号后面一定要加空格,而且不要在逗号之前加空格。

举例:

  • Good
{r} 复制代码
average <- mean(feet / 12 + inches, na.rm = TRUE)
  • Bad
{r} 复制代码
average<-mean(feet/12+inches,na.rm=TRUE)

有一个小的例外: : 、 :: 和 ::: 周围不需要空格

举例:

  • Good
{r} 复制代码
x <- 1:10
base::get
  • Bad
{r} 复制代码
x <- 1 : 10
base :: get

在左括号前加一个空格,函数调用除外。

举例:

  • Good
{r} 复制代码
if (debug) do(x)
plot(x, y)
  • Bad
{r} 复制代码
if(debug)do(x)
plot (x, y)

额外间距(即,行中有多个空格),

如果它能改善等号或赋值的对齐 <- ,则可以

{r} 复制代码
list(
  total = a + b + c, 
  mean  = (a + b + c) / n
)

不要在括号或方括号中的代码周围放置空格
(除非有逗号,这种情况见上文)

举例:

  • Good
{r} 复制代码
if (debug) do(x)
diamonds[5, ]
  • Bad
{r} 复制代码
if ( debug ) do(x)  # debug旁边不要留空格
x[1, ]   # 逗号后面不要留空格
x[1 ,]  # 数字和逗号之间也不要有空格

2、Curly braces 花括号 {}

一个左花括号不应该在它自己的一行上,应该总是跟一个新的一行。

右花括号应该总是在自己的一行上,除非后面跟着 else 。

始终将代码放在花括号内。

举例:

  • Good
{r} 复制代码
if (y < 0 && debug) {
  message("Y is negative")
}

if (y == 0) {
  log(x)
} else {
  y ^ x
}
  • Bad
{r} 复制代码
if (y < 0 && debug)
message("Y is negative")

if (y == 0) {
  log(x)
} 
else {
  y ^ x
}

在同一行上留下非常简短的语句是可以的

{r} 复制代码
if (y < 0 && debug) message("Y is negative")

3、Line length 长度

尽量将代码限制在每行80个字符。

这适合舒适的打印页面与合理大小的字体。

如果您发现自己的空间不足,应该将一些工作封装在单独的函数中。

4、Indentation 压缩

缩进代码时,使用两个空格space。

永远不要使用制表符tab或混合制表符和空格。

唯一的例外是,如果函数定义运行在多行上。

在这种情况下,将第二行重定向到定义开始的位置:

{r} 复制代码
long_function_name <- function(a = "a long argument", 
                               b = "another argument",
                               c = "another long argument") {
  # As usual code is indented by two spaces.
}

5、Assignment 赋值

使用 <-

而不是 =

相关推荐
箓维1 小时前
TCP Socket的进阶实现
网络·笔记·tcp/ip
二哈赛车手1 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
quantdash_cc1 小时前
ETF 行情数据清洗实战:字段语义拆解、标的池整理与五个校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
星恒随风2 小时前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
智学AI3 小时前
AI博主写作素材管理方法分享:资料归集、笔记关联与文档归档
人工智能·笔记
叼烟扛炮4 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
weixin_448119944 小时前
Datawhale Jev Cookbook 202610 笔记5
笔记
一木 之林4 小时前
Dify学习笔记 04 · 检索底座:Embedding、Rerank与向量数据库(第46-54集)
笔记·学习·embedding·dify
ljt27249606614 小时前
Python笔记(十一)--Numpy(一)
笔记·python·numpy
芯思路5 小时前
STM32开发学习笔记之十【AI部署】
笔记·stm32·学习