KEGG富集分析从未如此简单

作者: 因地制宜的生信达人 | 来源:发表于2018-01-23 11:50 被阅读70次

考虑到很多做实验的小伙伴对很多生物信息学概念不是很了解,受实验小白的委托,我给大家写了一个非常简单的工具。

欢迎点击试用: KEGG的超几何分布检验

也就是通常人们说的KEGG富集分析,也很简单,就是你复制粘贴一列基因名,就给你富集的结果,同样点击上面的目录就可以进入使用咯!

使用方法其实没什么好说的,就是复制粘贴你感兴趣的基因到输入框即可。我这里主要讲解,这个网页如何写出来的。

UI界面的代码如下:

suppressPackageStartupMessages(library(shiny))
suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(DT))
suppressPackageStartupMessages(library(stringr)  )
suppressPackageStartupMessages(library(clusterProfiler))
suppressPackageStartupMessages(library(shinyjs))
suppressPackageStartupMessages(library(shinyBS))

## 这个是侧边栏,就是你看到的网页坐标的输入框
## 分别是 下拉框,文字输入框,多选按钮,确定按钮。
sp <- sidebarPanel( 
  selectInput("IDtype",
              label = "choose the ID type",
              choices = c("HUGO Gene Symbol"  = "symbols",
                          "Entrez Gene ID"  = "geneIds", 
                          "ENSEMBL Gene ID" = "geneEnsembl")),
  ##  "symbols"     "geneIds"     "geneNames"   "geneEnsembl" "geneMap"     "geneAlias"
  h3("Type the Gene List:"),
  tags$style(type="text/css", "textarea {width:100%}"),
  tags$textarea(id = 'input_text', 
                placeholder = "TP53\nCBX6", 
                rows = 8, ''),  
  hr(), 
  radioButtons("species", "Select a species:",
               c("human(Homo sapiens)"="human",
                 "mouse(Mus Musculus)"="mouse" ),
               selected = 'human' 
  ), 
  hr(), 
  bsAlert("alert_ui_anchorId"),
  actionButton("do", "analysis", icon("paper-plane"), 
               style="color: #fff; background-color: #337ab7; border-color: #2e6da4"
  )
  
)
## 这个是主栏,就显示两个表格即可。
mp <- mainPanel(
  h3('KEGG enrichment:'), 
  DT::dataTableOutput('KEGG_df'),
  hr() ,
  h3('Gene Annotation result:'),
  DT::dataTableOutput('gene_df'), 
  
  hr() 
)

## 主程序入口,是一个侧边栏格式的网页,所以需要定义侧栏和主栏!
shinyUI(
  fluidPage( 
    titlePanel('KEGG enrichment'),
    sidebarLayout(
      sidebarPanel = sp,
      mainPanel = mp
    )
  )
)

然后是server服务端代码

suppressPackageStartupMessages(library(shiny))
suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(DT))
suppressPackageStartupMessages(library(stringr)  )
suppressPackageStartupMessages(library(clusterProfiler))
suppressPackageStartupMessages(library(shinyjs))
suppressPackageStartupMessages(library(shinyBS))

suppressMessages(library(RSQLite)) 
sqlite    <- dbDriver("SQLite")

createLink <- function(base,val) {
  sprintf('<a href="%s" class="btn btn-link" target="_blank" >%s</a>',base,val) ##target="_blank" 
}


log_cat <- function(info='hello world~',file='log.txt'){
  cat(as.character(Sys.time()),info ,"\n",file=file,append=TRUE)
}


shinyServer(function(input, output,session) { 
  ## 定义几个全局变量
  glob_values <- reactiveValues(
    gene_df=NULL, 
    kegg_df=NULL,
    species=NULL
  )
  
  reactiveValues.reset <-function(){
    glob_values$gene_df=NULL
    glob_values$species=NULL 
    glob_values$kegg_df=NULL
    
  }
  
## 主程序入口,用户点击了确定运行程序的按钮,就开始判断文字输入框是否有基因列表。
  observeEvent(input$do,{
    reactiveValues.reset() 

    db=ifelse(input$species == 'human','human_gene_info','mouse_gene_info')
    
    gene_list=NULL
    ## first check the upload file:
    inFile <- input$file1
    if ( ! is.null(inFile) ){ 
      gene_list=read.table(inFile$datapath, header=input$header)[,1] 
      
    } 
    ## Then check the text input area:
    if ( nchar(input$input_text) >5){
      gene_list  =  strsplit(input$input_text,'\n')[[1]] 
    }
    
    if( !is.null(gene_list)){
      if(length(gene_list) < 20){
        createAlert(session, "alert_ui_anchorId", "exampleAlert", title = "Oops",
                    content = " 你给的基因数量少于20,没啥意思,不给你富集了 !", append = FALSE)
      }else if(length(gene_list) > 2000 ){
        createAlert(session, "alert_ui_anchorId", "exampleAlert", title = "Oops",
                    content = " 给我多于2000个基因,我的服务器受不了呀,要不你先捐赠一下呗  ", append = FALSE)
      }else{
        closeAlert(session, "exampleAlert")
        gene_list=unique(gene_list)
        con <- dbConnect(sqlite,"hg19_bioconductor.sqlite")  
        sql <- paste0('select * from ',db," where ",input$IDtype,
                      " in ('",paste0(gene_list,collapse = "','"),"')")
        glob_values$gene_df=dbGetQuery(con, sql)
        dbDisconnect(con)  
        if (T ){ ## for kegg 
          suppressPackageStartupMessages(library(org.Mm.eg.db))
          suppressPackageStartupMessages(library(org.Hs.eg.db))
          
          gene_df = glob_values$gene_df
          ############################################################
          ############  gene ID transfer #############################
          ############################################################ 
          
          gene_list <- gene_df$symbol  
          
          gene.df=''
          if(input$species == 'human'){
            gene.df <- bitr(gene_list, fromType = "SYMBOL",
                            toType = c("ENSEMBL", "ENTREZID"),
                            OrgDb = org.Hs.eg.db )
            ego <- enrichKEGG(gene         = gene.df$ENTREZID,
                              organism     = 'hsa',
                              pvalueCutoff = 0.99,
                              qvalueCutoff=0.99
            )
            ego <- setReadable(ego, OrgDb = org.Hs.eg.db, keytype="ENTREZID")
          }else{
            gene.df <- bitr(gene_list, fromType = "SYMBOL",
                            toType = c("ENSEMBL", "ENTREZID"),
                            OrgDb = org.Mm.eg.db )
            ego <- enrichKEGG(gene         = gene.df$ENTREZID,
                              organism     = 'mmu',
                              pvalueCutoff = 0.99,
                              qvalueCutoff=0.99
            )
            ego <- setReadable(ego, OrgDb = org.Mm.eg.db, keytype="ENTREZID")
          }
          
          glob_values$kegg_df <- as.data.frame(ego)
          
        }  ## for kegg 
      }}  ##  if( !is.null(gene_list)){

  }) 

## 显示第一个表格,基因注释表格
  output$gene_df <- DT::renderDataTable({
    if (! is.null(glob_values$gene_df)){
      dat=glob_values$gene_df
      dat$geneIds=createLink(paste0("http://www.ncbi.nlm.nih.gov/gene/",dat$geneIds),dat$geneIds) 
      dat
    }
    
  }  ,rownames= FALSE,escape = FALSE,options = list(  
    pageLength = 10, 
    lengthMenu = list(c(10, 50, 100,-1), c('10', '50','100', 'All'))
  )## end for options 
  )
  
## 显示第二个表格,kegg富集结果表格
  output$KEGG_df <- DT::renderDataTable({
    if (! is.null(glob_values$kegg_df))
      glob_values$kegg_df
  }  ,rownames= FALSE,options = list(
    pageLength = 10,
    lengthMenu = list(c(10, 50, 100,-1), c('10', '50','100', 'All'))
    ,
    
    scrollX = TRUE,
    fixedHeader = TRUE,
    fixedColumns = TRUE ,
    deferRender = TRUE
  ),
  #filter = 'top',
  escape = FALSE
  )
  
})

组合两个程序,在Rstudio里面运行即可

你首先需要安装R,再安装Rstudio,然后安装shiny等R包。

然后把上面UI端代码拷贝成ui.R 的文件,再把服务端代码拷贝成server.R文件,放在同一个文件夹,命名为yourAPP里面。

然后进入R里面该文件夹上层目录,用runAPP('yourAPP')来执行即可!

是不是非常简单啊!

相关文章

网友评论

    本文标题:KEGG富集分析从未如此简单

    本文链接:https://www.haomeiwen.com/subject/pvcsaxtx.html