也谈 R 语言代码规范
楚新元 / 2025-07-01
以下是笔者使用 R 写代码过程中沉淀下的一些“良好”习惯,供读者参考。
使用 R 项目
使用项目管理代码和数据,永远不要使用绝对路径!代码修改后及时提交到 GitHub。
合理使用空格
-
运算符左右两端加空格
- 正例
1 + 1
- 反例
1+1
-
函数里逗号后使用空格
- 正例
head(mtcars, 3)
- 反例
head(mtcars,3)
-
自定义函数的
()
和{
之间使用空格- 正例
add = \(x, y) { z = x + y return(z) }
- 反例
add = \(x, y){ z = x + y return(z) }
-
if
和括号之间使用空格- 正例
if (!require(abc)) { install.packages("abc") }
- 反例
if(!require(abc)){ install.packages("abc") }
-
注释符号
#
后使用空格- 正例
# 这是注释
- 反例
#这是注释
-
代码后的注释,代码和注释之间空两个空格
- 正例
print('Hello, world!') # 你好世界!
- 反例
print('Hello, world!')# 你好世界!
变量赋值
-
一行代码使用
=
赋值- 正例
a = 1
- 反例
a <- 1
-
管道连接的多行代码,最终结果使用
->
赋值- 正例
mtcars |> subset(cyl == 4) |> lm(mpg ~ wt, data = _) |> summary() -> result
- 反例
result = mtcars |> subset(cyl == 4) |> lm(mpg ~ wt, data = _) |> summary()
变量命名
-
变量一律使用英文,永远不要使用中文字符做变量名和函数名
-
常量用大写字母,其余变量用小写字母,多个单词用下划线连接
-
变量命名尽可能意义明确
- 正例
name = c("Jack", "Lucy")
- 反例
xm = c("Jack", "Lucy")
管道符
-
管道符使用
|>
,不使用%>%
-
如果只需要一个管道,建议不使用管道
- 正例
head(mtcars, 3)
- 反例
mtcars |> head(3)
-
管道符后不要写代码,换行写
- 正例
mtcars |> subset(cyl == 4) |> lm(mpg ~ wt, data = _)
- 反例
mtcars |> subset(cyl == 4) |> lm(mpg ~ wt, data = _)
其他事项
-
参数名称尽量不要省略
- 正例
outer(X = 1:5, Y = 11:15, FUN = "paste", sep = "_")
- 反例
df1 = data.frame( x1 = c("A", "B", "C"), x2 = c(1, 2, 4) ) df2 = data.frame( x1 = c("A", "B", "D"), x3 = c("T", "F", "T") ) df2 |> dplyr::right_join(df1, _) |> na.omit()
这个反例因为参数名没有写全,不仅使得代码很难阅读,而且还会导致报错!这是因为
|>
类型的管道,占位符要求必要有参数名。先补全占位符参数名:df2 |> dplyr::right_join(x = df1, y = _) |> na.omit()
即使补全了占位符的参数名,依然会给出警告,进一步明确键所在的列后问题才算完美解决。
df2 |> dplyr::right_join(x = df1, y = _, by = "x1") |> na.omit()
补全参数名虽然感觉麻烦点,但是好处是你不需要考虑参数的位置,实现了另一种意义上的自由!
-
一行代码如果很长,建议分成多行书写,左括号后面不要写代码
-
如果分组只用于后续一次计算,请使用临时分组,不要用
group_by()
未完待续……。