R语言编码风格

——by不是杀杀

为了使我们写的代码更容易阅读、避免过段时间再看自己写的代码就头疼,我们在写代码的时候应该注意一些编码风格。大家可以选择一种自己喜欢的风格约束自己的代码,以下是来自Google的R语言编码风格。

参考:https://nanx.me/rstyle/

命名

文件命名

.R结尾,文件名最好能够一看就知道这个文件是用来做什么的

标识符命名

  1. 函数名首字母大写,且不用分隔符。函数名应为动词或动词性短语
  2. 参数首字母不大写,可以使用分隔符
  3. 常数命名规则和函数相同,但需要加上一个k开头,表明为常数

语法

缩进

不要混用制表符和空格。
当括号内进行换行时,下一行与括号内的第一个字符对齐

空白

  1. 在所有二元操作符(=,+,-,<-,等)的两侧加上空格
  2. 但在函数调用中传递参数时=两边的空格可以不加
  3. 逗号前面不加空格,逗号后面加空格
  4. 在(前加空格,函数调用时不用
  5. 不要在圆括号或方括号中的代码两侧加入空格

花括号

前括号永远不应该独占一行
后括号应当总是独占一行
代码块再短也要在新的一行开始写

# 不应该这样
if (is.null(ylim)) {ylim <- c(0, 0.06)}  
# 应该写成这样
if (is.null(ylim)) {
    ylim <- c(0, 0.06)
}  

赋值

用 <- 进行赋值, 不用 = 赋值

分号

不用分号结束一行,也不要利用分号在同一行放多个命令
完全可以不使用分号

代码组织

总体布局和顺序

  1. 版权声明注释
  2. 作者信息注释
  3. 功能注释, 包括程序的用途, 输入和输出
  4. source() 和 library() 语句
  5. 函数
  6. 要执行的语句

单元测试应在另一个名为 原始的文件名_unittest.R 的独立文件中进行

注释

整行注释: # 后接一个空格开始
行内短注释:在代码后接两个空格, #, 再接一个空格

函数的定义和调用

先列出无默认值的参数, 然后再列出有默认值的参数

函数文档

函数在定义行下方都应当紧接一个注释区. 这些注释应当由如下内容组成:

此函数的一句话描述
此函数的参数列表, 用 Args: 表示, 对每个参数的描述 (包括数据类型)
以及对于返回值的描述, 以 Returns: 表示.

这样就可以不需要努力查看源代码再使用该函数了
例如:

        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 invalid 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)
        }

好了,看完这些基本的格式,现在让我立刻修改我之前写的一段混乱的代码
代码如下

library('optparse')

Round_ratio<- function(imputMat,Cutoff=0,Sat=1)   # Sat:默认为1,几统计大于等于Sat的个数和小于Sat的个数
                                                #Cutoff:若比值小于Cutoff则丢弃这个序列,默认为0 即默认关闭
{  
    ## 去掉为0的序列
    for(i in (3:ncol(imputMat))){
         imputMat<- imputMat[-which(imputMat[,i]==0),]
        if(Cutoff){
            imputMat<- imputMat[-which(imputMat[,i]<Cutoff),]
            if(dim(imputMat)[1]==0){print("Error: 删除存在小于阈值的序列后,剩余序列为0");return()}
        }
    }
    Rratio <- imputMat[,1:2]
    imputMat <- imputMat[,-c(1,2)]  # 去掉一二列,即删除序列和total
    Number_of_col<- dim(imputMat)[2]  #计算出一共有几列
 #  RenameList <- matrix(NA,nrow=Number_of_colj,ncol=1)
    for(i in 2:Number_of_col){
        temp <- as.matrix(round(imputMat[,i]/imputMat[,(i-1)],2))
        Rratio <- cbind(Rratio,temp)
        Name <- paste(colnames(imputMat)[i],colnames(imputMat)[i-1],sep = "/")   #生成列名
        colnames(Rratio)[i+1] <- Name    #重命名列
    }
   
    return(Rratio)
}
ratio_mat <- Round_ratio(result_seq,Cutoff)
write.table(ratio_mat,"比值结果.csv",quote = F,col.names = T,row.names = F,sep=',')

修改之后:

library('optparse')

Roundratio <- function (imputmat, cutoff=0, sat=1){  
# 该函数用于计算每一轮序列的比值
# 
# 参数:
#   imputmat:输入文件,要求第一列为序列,第二列为总序列数,第三列开始为每轮序列数
#   sat:几统计大于等于sat的个数和小于sat的个数,默认为1
#   cutoff:若比值小于cutoff则丢弃这个序列,默认为0 
#
# 返回:
#   该输入的每轮序列的比值

# 去掉为0的序列
    for (i in (3 : ncol (imputmat))){
        index <- which(imputmat[, i] == 0)
        imputmat<- imputmat[-index, ]
        if (cutoff){
            index <- which(imputmat[, i] < cutoff)
            imputmat<- imputmat[-index, ]
            if (dim (imputmat)[1] == 0){
                stop ("删除存在小于阈值的序列后,剩余序列为0")
            }
        }
    }
    roundratio_mat <- imputmat[, 1 : 2]
    imputmat <- imputmat[, -c(1, 2)]  # 去掉一二列,即删除序列和total
    number_of_col <- dim (imputmat)[2]  # 计算出一共有几列
    for (i in 2 : number_of_col){
        temp <- as.matrix (round (imputmat[, i] / imputmat[, (i - 1)], 2))
        roundratio_mat <- cbind (roundratio_mat,temp)
        new_colname <- paste (colnames (imputmat)[i], colnames (imputmat)[i - 1], sep="/")  # 生成列名
        colnames (roundratio_mat)[i + 1] <- new_colname  # 重命名列
    }
    return (roundratio_mat)
}
ratio <- Roundratio(result_seq, cutoff)
write.table (ratio, "比值结果.csv", quote=F, col.names=T, row.names=F, sep=',')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读、...
    萧子柔阅读 1,923评论 0 9
  • 本文转自:Swift 编码风格指南 | www.samirchen.com 背景 本文主要是对以下几个编码规范的整...
    SamirChen阅读 1,200评论 1 4
  • 代码除了用来运行外,更多的是用来读。为了是代码的可读性更强,很多编程语言都有自己的编码规范。规范的制定是为了保持代...
    派派森森阅读 480评论 0 6
  • 首次发表在个人博客 前言 程序语言的编码风格指南对于一个长期维护的软件而言是非常重要的;好的编程风格有助于写出质量...
    IOneStar阅读 333评论 0 1
  • 写作本文旨在加深自己印象,也为了更多人的了解到JS编码风格,提高自己的编码质量想了解更多的内容请阅读《编写可维护的...
    小贤笔记阅读 405评论 0 2