考虑到很多做实验的小伙伴对很多生物信息学概念不是很了解,受实验小白的委托,我给大家写了一个非常简单的工具。
欢迎点击试用: 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')来执行即可!
是不是非常简单啊!
网友评论