R的編碼風格指南

概要: R編碼風格約定編程

1. 文件命名: 以.R(大寫)結尾函數

2. 標識符命名: variable.name, FunctionName, kConstantName佈局

3. 單行長度: 不超過80個字符單元測試

4. 縮進: 兩個空格, 不使用製表符測試

5. 空白編碼

6. 花括號: 前括號不折行寫, 後括號獨佔一行spa

7. else語句: 用花括號包圍.net

8. 賦值符號: 使用<-, 而非=debug

9. 分號: 不要用code

10. 整體佈局和順序

11. 註釋準則: 全部註釋以#開始, 後接一個空格; 行內註釋須要在#前加兩個空格

12. 函數的定義和調用

13. 函數文檔

14. 示例函數

15. TODO書寫風格: TODO(用戶名)

 

概要: R語言使用規則

1. attach: 避免使用

2. 函數: 錯誤(error)應當使用stop()拋出

3. 對象和方法: 儘量避免使用S4對象和方法; 永遠不要混用S3和S4

 

表示和命名

文件命名

    文件名應以.R(大寫)結尾, 文件名自己要有意義. 

    正例: predict_ad_revenue.R

    反例: foo.R


標識符命名

    在標識符中不要使用下劃線(_)或連字符(-). 標識符應根據以下慣例命名. 變量名應使用點(.)分隔全部的小寫字母或單詞; 函數名首字母大寫, 不用點分隔(所含單詞首字母大寫); 常數命名規則同函數, 但需使用一個k開頭.

    variable.name

        正例: avg.clicks

        反例: avg_Clicks, avgClicks

    FunctionName

        正例: CalculateAvgClicks

        反例: calculate_avg_clicks, calculateAvgClick

        函數命名應爲動詞或動詞性短語. 

        例外: 當建立一個含類(class)屬性的對象時, 函數名(也是constructor)和類名(class)應當匹配(例如, lm).

    kConstantName


語法

    單行長度

        最大單行長度爲80個字符. 


縮進

    使用兩個空格來縮進代碼. 永遠不要使用製表符或混合使用兩者. 

    例外: 當括號內發生折行時, 所折行與括號內的第一個字符對齊. 

 

空白

    在全部二元操做符(=, +, -, <-等等)的兩側加上空格. 

    例外: 在函數調用中傳遞參數時=兩邊的空格可加可不加. 

    不可在逗號前加空格, 逗號後總須加空格.

    正例: 

?

1
2
3
tab.prior <- table(df[df$days.from.opt <  0 "campaign.id" ])
total <- sum(x[,  1 ])
total <- sum(x[ 1 , ])

    反例: 

?

1
2
3
4
5
6
tab.prior <- table(df[df$days.from.opt< 0 "campaign.id" ])  # 在 '<' 兩側須要增長空格
tab.prior <- table(df[df$days.from.opt <  0 , "campaign.id" ])  # 逗號後須要一個空格
tab.prior<- table(df[df$days.from.opt <  0 "campaign.id" ])  # 在<-前須要一個空格
tab.prior<-table(df[df$days.from.opt <  0 "campaign.id" ])  # 在<-兩側須要增長空格
total <- sum(x[, 1 ])  # 逗號後須要一個空格
total <- sum(x[ , 1 ])  # 逗號後須要一個空格, 而非逗號以前

    在前括號前加一個空格, 函數調用時除外. 

    正例:

?

1
if  (debug)

    反例: 

?

1
if (debug)

    多加空格(好比在行內使用多於一個空格)也是能夠的, 若是這樣作可以改善等號或箭頭(<-)的對齊效果. 

?

1
2
3
4
5
6
plot(x    = x.coord,
      y    = data.mat[, MakeColName(metric, ptiles[ 1 ],  "roiOpt" )],
      ylim = ylim,
      xlab =  "dates" ,
      ylab = metric,
      main = (paste(metric,  " for 3 samples " , sep =  "" )))

    不要向圓括號或方括號中的代碼兩側加入空格. 

    例外: 逗號後總須加空格. 

    正例:

?

1
2
if  (debug)
x[ 1 , ]

    反例: 

?

1
2
if  ( debug )  # debug的兩邊不要加空格
x[ 1 ,]  # 須要在逗號後加一個空格


花括號

    前括號永遠不該該獨佔一行; 後括號應當老是獨佔一行. 您能夠在代碼塊只含單個語句時省略花括號; 但在處理這類單個語句時, 您必須先後一致地要麼所有使用花括號, 或者所有不用花括號. 

?

1
2
3
if  (is. null (ylim)) {
   ylim <- c( 0 0.06 )
}

    或(不可混用)

?

1
2
if  (is. null (ylim))
   ylim <- c( 0 0.06 )

    總在新起的一行開始書寫代碼塊的主體. 

    反例: 

?

1
2
if  (is. null (ylim)) ylim <- c( 0 0.06 )
if  (is. null (ylim)) {ylim <- c( 0 0.06 )}

 

用花括號包圍else語句

    else語句應該用花括號在同一行包圍起來.

    正例:

?

1
2
3
4
5
if  (condition) {
   one or more lines
else  {
   one or more lines
}

    反例:

?

1
2
3
4
5
6
if  (condition) {
   one or more lines
}
else  {
   one or more lines
}

    反例:

?

1
2
3
4
if  (condition)
   one line
else
   one line

 

賦值

    使用<-進行賦值, 不用=賦值. 

    正例: 

?

1
x <-  5

    反例: 

?

1
x =  5


分號

    不要以分號結束一行, 也不要利用分號在同一行放多於一個命令. (分號是毫無必要的, 而且爲了與其餘Google編碼風格指南保持一致, 此處一樣略去. )

 

代碼組織

    整體佈局和順序

        若是全部人都以相同順序安排代碼內容, 咱們就能夠更加輕鬆快速地閱讀並理解他人的腳本了.  

            1. 版權聲明註釋

            2. 做者信息註釋

            3. 文件描述註釋, 包括程序的用途, 輸入和輸出

            4. source()和library()語句

            5. 函數定義 

            6. 要執行的語句, 若是有的話(例如, print, plot)

        單元測試應在另外一個名爲原始的文件名_unittest.R的獨立文件中進行. 

 

    註釋準則

        註釋您的代碼. 整行註釋應以#後接一個空格開始.

        行內短註釋應在代碼後接兩個空格, #, 再接一個空格. 

?

1
2
3
4
5
6
# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pct.spent,
      breaks =  "scott" ,  # method  for  choosing number of buckets
      main   =  "Histogram: fraction budget spent by campaignid" ,
      xlab   =  "Fraction of budget spent" ,
      ylab   =  "Frequency (count of campaignids)" )

 

    函數的定義和調用

        函數定義應首先列出無默認值的參數, 而後再列出有默認值的參數. 

        函數定義和函數調用中, 容許每行寫多個參數; 折行只容許在賦值語句外進行. 

        正例: 

?

1
PredictCTR <- function(query, property, numDays, showPlot = TRUE)

        反例: 

?

1
2
PredictCTR <- function(query, property, num.days, show.plot =
                        TRUE)

        理想狀況下, 單元測試應該充當函數調用的樣例(對於包中的程序來講). 


 

    函數文檔

        函 數在定義行下方都應當緊接一個註釋區. 這些註釋應當由以下內容組成: 此函數的一句話描述; 此函數的參數列表, 用Args: 表示, 對每一個參數的 描述(包括數據類型); 以及對於返回值的描述, 以Returns: 表示. 這些註釋應當描述得足夠充分, 這樣調用者無須閱讀函數中的任何代碼便可 使用此函數. 

 

    示例函數

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CalculateSampleCovariance <- function(x, y, verbose = TRUE) {
   # Computes the sample covariance between two vectors.
   #
   # Args:
   #   x: One of two vectors whose sample covariance is to be calculated.
   #   y: The other vector. x and y must have the same length, greater than one,
   #      with no missing values.
   #   verbose: If TRUE, prints sample covariance;  if  not, not. Default is TRUE.
   #
   # Returns:
   #   The sample covariance between x and y.
   n <- length(x)
   # Error handling
   if  (n <=  1  || n != length(y)) {
     stop( "Arguments x and y have different lengths: " ,
          length(x),  " and " , length(y),  "." )
   }
   if  (TRUE %in% is.na(x) || TRUE %in% is.na(y)) {
     stop( " Arguments x and y must not have missing values." )
   }
   covariance <- var(x, y)
   if  (verbose)
     cat( "Covariance = " , round(covariance,  4 ),  ".\n" , sep =  "" )
   return (covariance)
}

 

    TODO書寫風格

        編碼時通篇使用一種一致的風格來書寫TODO. 

        TODO(用戶名): 所要採起行動的明確描述

 

語言 

    Attach

        使用attach形成錯誤的可能數不勝數. 避免使用它. 

 

    函數

        錯誤(error)應當使用stop()拋出. 

 

    對象和方法

        S 語言中有兩套面向對象系統, S3和S4, 在R中這兩套都可使用. S3方法的可交互性更強, 更加靈活, 反之, S4方法更加正式和嚴格. (對這 兩套系統的說明, 參見ThomasLumley的文 章"Programmer'sNiche: ASimpleClass, inS3andS4", 發表於RNews4/1, 2004, 33-36 頁: http://cran.r-project.org/doc/Rnews/Rnews_2004-1.pdf

        這裏推薦使用S3對象和方法, 除非您有很強烈的理由去使用S4對象和方法. 使用S4對象的一個主要理由是在C++代碼中直接使用對象. 使用一個S4泛型/方法的主要理由是對雙參數的分發.     

        避免混用S3和S4: S4方法會忽略S3中的繼承, 反之亦然. 

        例外: 除非有不去這樣作的好理由, 不然應當遵循以上描述的編碼慣例. 例外包括遺留代碼的維護和對第三方代碼的修改. 

 

結語

    遵照常識, 先後一致

    若是您在編輯現有代碼, 花幾分鐘看看代碼的上下文並弄清它的風格. 若是其餘人在if語句周圍使用了空格, 那您也應該這樣作. 若是他們的註釋是用星號組成的小盒子圍起來的, 那您也要這樣寫。

遵 循編碼風格準則的意義在於, 人們至關於有了一個編程的通用詞彙表, 因而人們能夠專一於您在說什麼, 而不是您是怎麼說的. 咱們在這裏提供全局的編碼 風格規則以便人們瞭解這些詞彙, 但局部風格也很重要. 若是您加入文件中的代碼看起來和周圍的已有代碼大相徑庭, 那麼代碼閱讀者的閱讀節奏就會被破 壞. 儘可能避免這樣作. OK, 關於如何寫代碼已經寫得夠多了; 代碼自己要有趣的多. 編碼愉快!

 

參考文獻

    http://www.maths.lth.se/help/R/RCC/ - R語言編碼慣例

    http://ess.r-project.org/ - 爲emacs用戶而生. 在您的emacs中運行R而且提供了一個emacsmode.

相關文章
相關標籤/搜索