编程规范

目录

文件及文件夹命名规范

  1. 尽量不要数字、_开头

  2. 分隔符尽量使用_,使用其他分隔符如-使用R读入需要修改对应的参数,否则会被强行转换

  3. 输出的文件,最好加上时间戳,文件夹最好不要加时间戳,不方便后续调用,按照功能或者使用工具名命名

  4. 命名方式:

    • 文件名:(样本名/分组名_)功能(分析类型)_使用工具名_时间戳.后缀名

      group1_vs_group2_differentiallyExpressedAnalysis_edgeR_20210930.csv

    • 文件夹:功能/分析类型/使用软件名

      /Result/Alignment/STAR/bam/

编程规范

  • 头文件

    • 脚本的功能
    • 版本信息
    • 作者联系方式
    • 版权声明
    • 历史记录
    • 脚本内特殊命令,使用绝对路径方式运行
    • 脚本运行时需要的环境变量预先声明与设置
  • 变量命名规范

    1. 各个变量名,可以使用小写字母开头,以下划线分割各单词,名称应该简明扼要描述该变量的含义,如output_file_name

    2. 函数命名,使用小写字母开头,以驼峰方式命名,名称应该简明扼要描述该函数的作用,如prepareDataVolcanoPlot

    3. 类名,使用大写字母开头,以驼峰方式命名,名称应该简明扼要描述该函数的作用,如GeneExpressionResults

  • 间隔

    1. 对于不同功能区块,推荐使用python方式的tab分割,比如if语句、循环语句、函数语句内部,如

      for(i in 1:100){
      	a <- b + i
      	s <- a + b
      }
      
    2. 不同变量之间或者符号之间使用一个空格间隔,如a = b + c

    3. 一条语句不适合写的过长,这样不利于阅读,超过一定长度,或者对于一些参数多的函数,可以一行仅放置一个参数的赋值,彼此对齐,利于清晰查阅各参数。

    4. 对于函数或者循环等,后接一个代码块,区块分隔符{}(R语言)如1中所示,分隔符{}分别在单独一行,中间接代码

  • 注释

    1. 重要的语句、功能需要注释其目的、功能
    2. 函数需要说明函数的功能,实现什么功能;有哪些参数,每个参数是什么功能
    3. 不同代码块可以使用注释区别
# 示例
MDSPlot <- function(count_mat, group_map, group_compare, output_dir){
  library(ggplot2)
  library(edgeR)
  library(dplyr)
  today <- format(Sys.Date(), format = '%Y%m%d')
  # get special group samples' expMatrix
  group_map <- group_map[(group_map$Group %in% group_compare), ]
  count_mat <- count_mat[ ,(colnames(count_mat) %in% group_map$Sample)]
  group <- group_map$Group
  sample <- group_map$Sample
  # log_normal_count
  dgelist <- DGEList(counts = as.matrix(count_mat))
  keep <- rowSums(cpm(dgelist) > 1 ) >= 2
  dgelist <- dgelist[keep, , keep.lib.sizes = FALSE]
  # TMM normalization
  dgelist_norm <- calcNormFactors(dgelist, method = 'TMM')
  # log-norm+1
  norm_res <- dgelist_norm@.Data[[1]] %>% data.frame()
  log_norm <- log2(norm_res+1)
  # mds
  mds <- plotMDS(dgelist_norm)
  print(mds@.Data[[6]])
  print(mds@.Data[[7]])
  print(mds@.Data[[8]])
  print(mds@.Data[[9]])
  print(mds@.Data[[5]])
  var_explained <- (mds$var.explained*100) %>% round(., digits = 0) %>% as.character
  x_lab <- paste0(mds$axislabel, '1', '(', var_explained[1], '%', ')')
  y_lab <- paste0(mds$axislabel, '2', '(', var_explained[2], '%', ')')
  toplot <- data.frame(Dim1 = mds$x, Dim2 = mds$y, Sample = sample, Group = group)
  # theme -------------------------------------------------------------------
  mytheme<-theme_bw()+theme(
    panel.grid=element_blank(),
    text=element_text(colour="black"),
    axis.text=element_text(size=rel(1)),
    axis.title=element_text(size=rel(1.2),lineheight=0.4,hjust=0.5),
    panel.border=element_rect(size=0.3,colour="black"),
    plot.title=element_text(size=rel(1.5),lineheight=0.7,hjust=0.5),
    legend.title=element_text(colour="black", size=rel(1.2)),
    legend.text = element_text(size = rel(1.2)),
    legend.key=element_rect(colour = "white"),
    axis.line=element_blank()
  )
  ggplot(toplot, aes(Dim1, Dim2, colour = Group)) + geom_point(size = 3) + mytheme +
  xlab(x_lab) + ylab(y_lab) + 
  geom_text(aes(label = Sample, vjust = 1.1, hjust = -0.5), show_guide = FALSE)
  group_name <- ''
  for (i in 1:length(group_compare)) {
    group_name <- paste(group_name, group_compare[i], sep = '_')
  }
  out_name <- paste0(output_dir, '/MDSplot_', today, group_name, '.pdf')
  ggsave(out_name, width = 10, height = 8)
  return(log_norm)
}