考虑到很多做实验的小伙伴对很多生物信息学概念不是很了解,受实验小白的委托,我给大家写了一个非常简单的工具:KEGG富集分析
我这么跟你说吧:人类的七千多个基因组都是有已知功能的,KEGG把这七千多个基因分成了300个类,就是我们通常说的kegg通路;比如,我现在做了个实验,发现某细胞系里面的两万个基因里面有300个基因变化了,那这300个基因会涉及到KEGG数据库的哪几个通路?这时候就需要用到我的工具啦~将这300个基因加入工具里面,得出结果:有30个Cell cycle通路。 接下来还会用到我这个小工具:事实上,Cell Cycle KEGG 通路 hsa04110只有124个基因;而我处理了细胞系之后,在只有300个基因发生统计学显著变化的情况下,就有30个是Cell Cycle通路?高达10%的概率,那到底这个Cell Cycle通路是不是被显著改变了呢? 首先,我会把用户的300个基因,都用KEGG数据库的300个通路注释,然后一个个通路循环做超几何分布检验,给出P值;比如刚才的Cell Cycle 通路就很显著,因为124/7000就2%的概率,结果我 30/300有10%的概率~太可怕了,所以我的这个处理显著的改变了细胞系的Cell Cycle 通路。
使用方法其实没什么好说的,就是复制粘贴你感兴趣的基因到输入框即可。我这里主要讲解,这个网页如何写出来的。
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 <->->
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
)
)
)
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 <->->'SQLite')
createLink <->->function(base,val) {
sprintf('%s',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 <->->
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 <->->
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 <->->'hg19_bioconductor.sqlite')
sql <->->'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="" ="" ="" ="" ="">->
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="" ="" ="" ="" ="">->
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 <->->
if (! is.null(glob_values$gene_df)){
dat=glob_values$gene_df
dat$geneIds=createLink(paste0('http://www.ncbi.nlm./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 <->->
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
)
})
1、首先安装R,再安装Rstudio,然后安装shiny等多个R包。
2、把上面UI端代码拷贝成ui.R 的文件,再把服务端代码拷贝成server.R文件,放在同一个文件夹,命名为yourAPP里面。 3、进入R里面,该文件夹上层目录,用runAPP('yourAPP')来执行即可 当然,最简单的就是去https://github.com/jmzeng1314/myShiny 我的GitHub里面把代码下载,或者查看其它工具咯
UI界面如下:
|