R代码风格

Author

Li Zongzhang

Published

April 10, 2024

# install.packages("tidyverse")
library(tidyverse)

1 空格

1.1 逗号后空格号

# good
mpg[, 1]
# A tibble: 234 × 1
   manufacturer
   <chr>       
 1 audi        
 2 audi        
 3 audi        
 4 audi        
 5 audi        
 6 audi        
 7 audi        
 8 audi        
 9 audi        
10 audi        
# ℹ 224 more rows
hist(mpg$hwy, breaks = 20, col = "skyblue", 
     main = "Histogram of Highway Mileage", 
     xlab = "Miles per Gallon")

# bad
mpg[ ,1]
# A tibble: 234 × 1
   manufacturer
   <chr>       
 1 audi        
 2 audi        
 3 audi        
 4 audi        
 5 audi        
 6 audi        
 7 audi        
 8 audi        
 9 audi        
10 audi        
# ℹ 224 more rows
hist(mpg$hwy ,breaks = 20 ,col = "skyblue", 
     main = "Histogram of Highway Mileage", 
     xlab = "Miles per Gallon")

1.2 运算符前后空格

=、==、+、-、<-, ~, %>%,|等用空格包围

# good
model1 <- lm(cty ~ displ + cyl, data = mpg)
summary(model1)

Call:
lm(formula = cty ~ displ + cyl, data = mpg)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.9276 -1.4750 -0.0891  1.0686 13.9261 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  28.2885     0.6876  41.139  < 2e-16 ***
displ        -1.1979     0.3408  -3.515 0.000529 ***
cyl          -1.2347     0.2732  -4.519 9.91e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.466 on 231 degrees of freedom
Multiple R-squared:  0.6671,    Adjusted R-squared:  0.6642 
F-statistic: 231.4 on 2 and 231 DF,  p-value: < 2.2e-16
mpg %>% lm(cty ~ displ + cyl, data = .) %>% summary()

Call:
lm(formula = cty ~ displ + cyl, data = .)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.9276 -1.4750 -0.0891  1.0686 13.9261 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  28.2885     0.6876  41.139  < 2e-16 ***
displ        -1.1979     0.3408  -3.515 0.000529 ***
cyl          -1.2347     0.2732  -4.519 9.91e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.466 on 231 degrees of freedom
Multiple R-squared:  0.6671,    Adjusted R-squared:  0.6642 
F-statistic: 231.4 on 2 and 231 DF,  p-value: < 2.2e-16
# bad
model1<-lm(cty~displ+cyl,data=mpg)
summary(model1)

Call:
lm(formula = cty ~ displ + cyl, data = mpg)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.9276 -1.4750 -0.0891  1.0686 13.9261 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  28.2885     0.6876  41.139  < 2e-16 ***
displ        -1.1979     0.3408  -3.515 0.000529 ***
cyl          -1.2347     0.2732  -4.519 9.91e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.466 on 231 degrees of freedom
Multiple R-squared:  0.6671,    Adjusted R-squared:  0.6642 
F-statistic: 231.4 on 2 and 231 DF,  p-value: < 2.2e-16
mpg%>%lm(cty~displ+cyl,data=.)%>%summary()

Call:
lm(formula = cty ~ displ + cyl, data = .)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.9276 -1.4750 -0.0891  1.0686 13.9261 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  28.2885     0.6876  41.139  < 2e-16 ***
displ        -1.1979     0.3408  -3.515 0.000529 ***
cyl          -1.2347     0.2732  -4.519 9.91e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.466 on 231 degrees of freedom
Multiple R-squared:  0.6671,    Adjusted R-squared:  0.6642 
F-statistic: 231.4 on 2 and 231 DF,  p-value: < 2.2e-16

1.3 无需空格的情况

具有高优先级的运算符包括:::、:::、$、@、[、[[、^,不用空格包围

# good
mpg$cty
  [1] 18 21 20 21 16 18 18 18 16 20 19 15 17 17 15 15 17 16 14 11 14 13 12 16 15
 [26] 16 15 15 14 11 11 14 19 22 18 18 17 18 17 16 16 17 17 11 15 15 16 16 15 14
 [51] 13 14 14 14  9 11 11 13 13  9 13 11 13 11 12  9 13 13 12  9 11 11 13 11 11
 [76] 11 12 14 15 14 13 13 13 14 14 13 13 13 11 13 18 18 17 16 15 15 15 15 14 28
[101] 24 25 23 24 26 25 24 21 18 18 21 21 18 18 19 19 19 20 20 17 16 17 17 15 15
[126] 14  9 14 13 11 11 12 12 11 11 11 12 14 13 13 13 21 19 23 23 19 19 18 19 19
[151] 14 15 14 12 18 16 17 18 16 18 18 20 19 20 18 21 19 19 19 20 20 19 20 15 16
[176] 15 15 16 14 21 21 21 21 18 18 19 21 21 21 22 18 18 18 24 24 26 28 26 11 13
[201] 15 16 17 15 15 15 16 21 19 21 22 17 33 21 19 22 21 21 21 16 17 35 29 21 19
[226] 20 20 21 18 19 21 16 18 17
mpg[, 1]
# A tibble: 234 × 1
   manufacturer
   <chr>       
 1 audi        
 2 audi        
 3 audi        
 4 audi        
 5 audi        
 6 audi        
 7 audi        
 8 audi        
 9 audi        
10 audi        
# ℹ 224 more rows
psych::describe(mpg)
              vars   n    mean    sd median trimmed   mad    min  max range
manufacturer*    1 234    7.76  5.13    6.0    7.68  5.93    1.0   15  14.0
model*           2 234   19.09 11.15   18.5   18.98 14.08    1.0   38  37.0
displ            3 234    3.47  1.29    3.3    3.39  1.33    1.6    7   5.4
year             4 234 2003.50  4.51 2003.5 2003.50  6.67 1999.0 2008   9.0
cyl              5 234    5.89  1.61    6.0    5.86  2.97    4.0    8   4.0
trans*           6 234    5.65  2.88    4.0    5.53  1.48    1.0   10   9.0
drv*             7 234    1.67  0.66    2.0    1.59  1.48    1.0    3   2.0
cty              8 234   16.86  4.26   17.0   16.61  4.45    9.0   35  26.0
hwy              9 234   23.44  5.95   24.0   23.23  7.41   12.0   44  32.0
fl*             10 234    4.63  0.70    5.0    4.77  0.00    1.0    5   4.0
class*          11 234    4.59  1.99    5.0    4.64  2.97    1.0    7   6.0
               skew kurtosis   se
manufacturer*  0.21    -1.63 0.34
model*         0.11    -1.23 0.73
displ          0.44    -0.91 0.08
year           0.00    -2.01 0.29
cyl            0.11    -1.46 0.11
trans*         0.29    -1.65 0.19
drv*           0.48    -0.76 0.04
cty            0.79     1.43 0.28
hwy            0.36     0.14 0.39
fl*           -2.25     5.76 0.05
class*        -0.14    -1.52 0.13
# bad
mpg $ cty
  [1] 18 21 20 21 16 18 18 18 16 20 19 15 17 17 15 15 17 16 14 11 14 13 12 16 15
 [26] 16 15 15 14 11 11 14 19 22 18 18 17 18 17 16 16 17 17 11 15 15 16 16 15 14
 [51] 13 14 14 14  9 11 11 13 13  9 13 11 13 11 12  9 13 13 12  9 11 11 13 11 11
 [76] 11 12 14 15 14 13 13 13 14 14 13 13 13 11 13 18 18 17 16 15 15 15 15 14 28
[101] 24 25 23 24 26 25 24 21 18 18 21 21 18 18 19 19 19 20 20 17 16 17 17 15 15
[126] 14  9 14 13 11 11 12 12 11 11 11 12 14 13 13 13 21 19 23 23 19 19 18 19 19
[151] 14 15 14 12 18 16 17 18 16 18 18 20 19 20 18 21 19 19 19 20 20 19 20 15 16
[176] 15 15 16 14 21 21 21 21 18 18 19 21 21 21 22 18 18 18 24 24 26 28 26 11 13
[201] 15 16 17 15 15 15 16 21 19 21 22 17 33 21 19 22 21 21 21 16 17 35 29 21 19
[226] 20 20 21 18 19 21 16 18 17
mpg [ , 1]
# A tibble: 234 × 1
   manufacturer
   <chr>       
 1 audi        
 2 audi        
 3 audi        
 4 audi        
 5 audi        
 6 audi        
 7 audi        
 8 audi        
 9 audi        
10 audi        
# ℹ 224 more rows
psych :: describe(mpg)
              vars   n    mean    sd median trimmed   mad    min  max range
manufacturer*    1 234    7.76  5.13    6.0    7.68  5.93    1.0   15  14.0
model*           2 234   19.09 11.15   18.5   18.98 14.08    1.0   38  37.0
displ            3 234    3.47  1.29    3.3    3.39  1.33    1.6    7   5.4
year             4 234 2003.50  4.51 2003.5 2003.50  6.67 1999.0 2008   9.0
cyl              5 234    5.89  1.61    6.0    5.86  2.97    4.0    8   4.0
trans*           6 234    5.65  2.88    4.0    5.53  1.48    1.0   10   9.0
drv*             7 234    1.67  0.66    2.0    1.59  1.48    1.0    3   2.0
cty              8 234   16.86  4.26   17.0   16.61  4.45    9.0   35  26.0
hwy              9 234   23.44  5.95   24.0   23.23  7.41   12.0   44  32.0
fl*             10 234    4.63  0.70    5.0    4.77  0.00    1.0    5   4.0
class*          11 234    4.59  1.99    5.0    4.64  2.97    1.0    7   6.0
               skew kurtosis   se
manufacturer*  0.21    -1.63 0.34
model*         0.11    -1.23 0.73
displ          0.44    -0.91 0.08
year           0.00    -2.01 0.29
cyl            0.11    -1.46 0.11
trans*         0.29    -1.65 0.19
drv*           0.48    -0.76 0.04
cty            0.79     1.43 0.28
hwy            0.36     0.14 0.39
fl*           -2.25     5.76 0.05
class*        -0.14    -1.52 0.13

2 赋值符

赋值符用<-, 不用=。 =只用于函数参数的赋值

# good
x <- 5

# bad
x = 5

3 代码换行

  • 一行代码不要太长

  • 换行保持缩进

  • 函数名单独一行

  • 每一个参数项单独一行

  • 最后一行,单独的一个右括号)占一行

# good
mpg %>%
  ggplot(aes(x = displ, y = cty, color = drv)) + 
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Scatterplot of Weight and MPG",
       x = "Displacement (in cubic inches)",
       y = "City Miles per Gallon"
       ) +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

# bad
mpg %>% ggplot(aes(x = displ, y = cty, color = drv)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + 
  labs(title = "Scatterplot of Weight and MPG", x = "Weight (in 1000 lbs)", y = "Miles per Gallon" ) + 
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

# good
mpg %>% 
  filter(class == "suv" | class == "compact") %>%
  ggplot(aes(x = displ, y = cty, col = class)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Scatterplot of Displacement and City MPG",
       x = "Displacement in Litres",
       y = "City Miles per Gallon"
       ) +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

# bad
mpg %>% 
filter(class == "suv" | class == "compact") %>%
ggplot(aes(x = displ, y = cty, col = class)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Scatterplot of Displacement and City MPG",
x = "Displacement in Litres",
y = "City Miles per Gallon") +
theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

4 代码美化 styler::style_text()

#install.packages("styler")
library(styler)

"lm(cty~displ+cyl,data=mpg)"%>% 
  style_text()
lm(cty ~ displ + cyl, data = mpg)
lm(cty ~ displ + cyl, data = mpg)

Call:
lm(formula = cty ~ displ + cyl, data = mpg)

Coefficients:
(Intercept)        displ          cyl  
     28.289       -1.198       -1.235  
"mpg%>%ggplot(aes(x=displ,y=cty,col=class))+geom_point()+geom_smooth(method='lm',se=FALSE)" %>% 
  style_text()
mpg %>% ggplot(aes(x = displ, y = cty, col = class)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)
mpg %>% ggplot(aes(x = displ, y = cty, col = class)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)
`geom_smooth()` using formula = 'y ~ x'

"mpg %>% 
filter(class=='suv'|class=='compact') %>%
ggplot(aes(x=displ, y=cty, col=class))+
geom_point()+
geom_smooth(method='lm', se=FALSE)+
labs(title='Scatterplot of Displacement and City MPG',
x='Displacement in Litres',
y='City Miles per Gallon')+
theme_minimal()" %>% 
  style_text()
mpg %>%
  filter(class == "suv" | class == "compact") %>%
  ggplot(aes(x = displ, y = cty, col = class)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    title = "Scatterplot of Displacement and City MPG",
    x = "Displacement in Litres",
    y = "City Miles per Gallon"
  ) +
  theme_minimal()