手把手教你使用shiny创建一个网页工具(基于Windows)

写在前面

无意中逛群主GitHub看到一个好玩的项目,就试着走了一波,有惊无险的跟了下来,中间还被我火眼金睛挑出来了3个bugs反馈给他!

原本以为就是一步步跟着说明书来搭建一个自己的网页工具。没曾想到我用Windows电脑演示,竟是一个非常困难的过程。

配置MySQL数据库

软件下载

进入https://dev.mysql.com/downloads/mysql/>按照下图演示进行软件下载

软件安装

我修改了只截图里的参数,其他保持默认

更改配置

安装成功之后,为了保证后续的R语言能正常使用MySQL,需要修改配置文件。默认安装的配置文件在"C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"。

[mysqld]中添加 local-infile=1

之后重启服务或者重启电脑也行。

创建用户和数据库

打开MySQL的终端

在其中创建新用户,并赋予全部的权限。

  1. # 创建数据库

  2. CREATE DATABASE tfmapperdb

  3.  DEFAULT CHARACTER SET latin1

  4.  DEFAULT COLLATE latin1_general_ci;

  5. # 创建用户

  6. CREATE USER tfmapperuser IDENTIFIED BY 'tfmapper_@Abc';

  7. GRANT ALL PRIVILEGES ON tfmapperdb.* TO 'tfmapperuser'@'%';

使用latin1的编码,这是因为后续的诡异报错。

下载Shiny代码

GitHub地址为: https://github.com/jmzeng1314/TF_map, 选择ZIP进行下载解压缩。

安装必要的R包

安装方式如下GIF图所示,基本步骤就是打开Shiny项目中的 TF_map.Rproj,然后打开其中 scripts/install_packages.R, 把里面提到的所有R包都装了就行。

这里面还没有提到一些物种数据的R包,因此这里也一并装了

  1. BiocManager::install("org.Hs.eg.db")

  2. BiocManager::install('org.Mm.eg.db')

  3. BiocManager::install('GEOmetadb')

数据导入MySQL

这一步极其的繁琐,因为涉及到数据过多,有些数据还特别大。

先加载好R包和配置账号密码, 调用MySQL

  1. library(RMySQL)

  2. host <<- "127.0.0.1"

  3. port <<- 3306

  4. user <<- "tfmapperuser"

  5. password <<-  'tfmapper_@Abc'

  6. library(RMySQL)

  7. con <- dbConnect(MySQL(), host=host, port=port, user=user, password=password)

  8. sql="USE tfmapperdb;"

  9. dbSendQuery(con, sql)

之后你需要检查编码, 使用 dbGetQuery(con,"SHOW VARIABLES LIKE 'character_set_%';")查看编码

保证 character_set_database应该是latin1. (如果是UTF-8会在后续分析中报错)

gene table

原本需要下载下面两个数据,

  • gencode.v20.annotation.gtf.gz

  • gencode.vM20.annotation.gtf.gz

然后用Perl脚本进行预处理,但是格式化的 gencode_v29_human_gene_infogencode_v29_human_gene_info已经在解压缩的 files里,因此不需要额外处理

  1. a=read.table('files/gencode_v29_human_gene_info',sep = '\t')

  2. head(a)

  3. colnames(a)=c('symbol'   ,  'type' ,   'ensembl'   , 'chr' ,'start', 'end' )

  4. dbWriteTable(con, 'gencode_v29_human_gene_info', a, append=F,row.names=F)

  5. sql='show tables;'

  6. dbGetQuery(con, sql)

  7. a=read.table('files/gencode_vM20_mouse_gene_info',sep = '\t')

  8. head(a)

  9. colnames(a)=c('symbol'   ,  'type' ,   'ensembl'   , 'chr' ,'start', 'end' )

  10. dbWriteTable(con, 'gencode_vM20_mouse_gene_info', a, append=F,row.names=F)

  11. sql='show tables;'

  12. dbGetQuery(con, sql)

gene name

从org包里面提取基因ID和基因名的对应关系,然后导入数据库中。

  1. library(org.Hs.eg.db)

  2. g2s=toTable(org.Hs.egSYMBOL)

  3. g2n=toTable(org.Hs.egGENENAME)

  4. s2n=merge(g2s,g2n,by='gene_id')

  5. dbWriteTable(con, 'human_genename',s2n, append=F,row.names=F)

  6. library(org.Mm.eg.db)

  7. g2s=toTable(org.Mm.egSYMBOL)

  8. g2n=toTable(org.Mm.egGENENAME)

  9. s2n=merge(g2s,g2n,by='gene_id')

  10. head(s2n)

  11. dbWriteTable(con, 'mouse_genename',s2n, append=F,row.names=F)

Cistrome metadata

将如下8个文件导入数据库

  • TFhumaninformation.txt

  • TFmousedata_information.txt

  • cahumandata_information.txt

  • camousedata_information.txt

  • histonehumandata_information.txt

  • histonemousedata_information.txt

  • otherhumandata_information.txt

  • othermousedata_information.txt

  1. tmp <- lapply(list.files(path = 'files/metaFiles/',pattern = "*.information.txt"),

  2.             function(x){

  3.                 a=read.table(file.path('files/metaFiles/',x),sep='\t',fill = T,quote = "")

  4.                 a$species=strsplit(x,'_')[[1]][2]

  5.                 a$type=strsplit(x,'_')[[1]][1]

  6.                 return(a)

  7.             })

  8. tmp <-  do.call(rbind,tmp)[,c(1,2,4:7,9:10)]

  9. head(tmp)

  10. colnames(tmp) <- strsplit('sampleID       GSM    bs1                 bs2      bs3       IP species    type','\\s+' )[[1]]

  11. head(tmp)

  12. dbWriteTable(con, 'cistrome_metadata', tmp , append=F,row.names=F)

  13. write.csv(tmp,'cistrome_metadata.csv')

这里如果之前创建数据库未设置成latin1编码,那么遇到一个报错

经过我排查,发现罪魁祸首就是"NUP98–PHF23"中的"中间连字符,中间那个"–"根本不是连字符。因为如果用UTF-8格式为csv后,在excel查看内容就变成了"NUP98鈥揚HF23"

Cistrome GSM metadata

下载 GEOmetadb.sqlite.gz文件。有两种方式,一种是先用 library(GEOmetadb)加载R包,然后用 getSQLiteFile()下载;或者是直接从http://starbuck1.s3.amazonaws.com/sradb/GEOmetadb.sqlite.gz进行下载,解压缩后文件是7G左右。

  1. db <- "GEOmetadb.sqlite" #实际地址,我放在了Shiny目录下

  2. file.info(db)

  3. conGEO <- dbConnect(SQLite(),db)

  4. dbListTables(conGEO)

  5. dbListFields(conGEO,"gsm")

  6. dbGetQuery(conGEO,"select * from gsm where gsm='GSM1267210' ")

  7. gsm_list=tmp$GSM

  8. length(unique(gsm_list))

  9. this_sql=paste0("select * from gsm where gsm in ('",paste(gsm_list,collapse = "','"),"')")

  10. print(this_sql)

  11. #tmp=dbGetQuery(con,'select * from gsm ')

  12. tmp2=dbGetQuery(conGEO,this_sql)

  13. dbDisconnect(conGEO)

  14. ## some of the GSM id missed in the GEOmetadb.sqlite, I didn't check the reason.

  15. dbWriteTable(con, 'cistrome_GSM_metadata', tmp2 , append=F,row.names=F)

  16. write.csv(tmp2,'cistrome_GSM_metadata.csv')

:这一步运行建立在上一步的成功基础上,没有上一步的tmp数据框,运行时一定出错。

Encode metadata

导入Encode的如下文件

  • humanTFGRCh38.conservative.bed.list.txt

  • humanhistoneGRCh38.replicated.peaks.bed.list.txt

  • mouseTFmm10.conservative.peaks.bed.list.txt

  • mousehistonemm10.replicated.peaks.bed.list.txt

  1.  setwd('files/metaFiles/')

  2.  a=read.table('human_histone_GRCh38.replicated.peaks.bed.list.txt',sep = '\t',

  3.               colClasses=c('character'),stringsAsFactors = F,quote = '')

  4.  # OLD :'cellline','celltype','tissue'

  5.  # NEW : 'bs1','bs2','bs3'

  6.  colnames(a)=c('sampleID','uniqID','bs1','bs2','bs3','gender','age','IP','url')

  7.  a$species='human';a$type='histone'

  8.  head(a)

  9.  # dbGetQuery(con,"DROP TABLE encode_metadata")

  10.  dbWriteTable(con, 'encode_metadata', a, append=F,row.names=F)

  11.  a=read.table('human_TF_GRCh38.conservative.bed.list.txt',sep = '\t',

  12.               colClasses=c('character'),stringsAsFactors = F,quote = '')

  13.  colnames(a)=c('sampleID','uniqID','bs1','bs2','bs3','gender','age','IP','url')

  14.  a$species='human';a$type='TF'

  15.  dbWriteTable(con, 'encode_metadata', a, append=T,row.names=F)

  16.  a=read.table('mouse_histone_mm10.replicated.peaks.bed.list.txt',sep = '\t',

  17.               colClasses=c('character'),stringsAsFactors = F,quote = '')

  18.  colnames(a)=c('sampleID','uniqID','bs1','bs2','bs3','gender','age','IP','url')

  19.  a$species='mouse';a$type='histone'

  20.  dbWriteTable(con, 'encode_metadata', a, append=T,row.names=F)

  21.  a=read.table('mouse_TF_mm10.conservative.peaks.bed.list.txt',sep = '\t',

  22.               colClasses=c('character'),stringsAsFactors = F,quote = '')

  23.  colnames(a)=c('sampleID','uniqID','bs1','bs2','bs3','gender','age','IP','url')

  24.  a$species='mouse';a$type='TF'

  25.  dbWriteTable(con, 'encode_metadata', a, append=T,row.names=F)

  26.  setwd('../../')

Peaks tables (2X2X2X(23+21))

这一步的数据比较多,需要发邮件到jmzeng1314@163.com 向作者申请处理后的peak文件。作者会给你提供一个微云网盘链接,我们以其中比较小的文件为例进行演示。

在shiny的应用文件夹创建一个文件夹db,然后将下面文件下载到该文件夹中。(选择一个较小的作为演示)

请保持原有的文件夹层次关系,例如这次下载的文件就应该存放在db/cistrome/human/DNase下。

如下是代码部分, 代码会遍历db下面的所有以merge.txt结尾的文件,

  1. all_tables<-dbListTables(con)

  2. all_tables

  3. root_dir <- 'db'

  4. ## totally 100Gb files

  5. all_files <- list.files(root_dir,pattern='*merge.txt',all.files=T,recursive=T)

  6. all_files

  7. lapply(all_files, function(x){

  8.  # x=all_files[1]

  9.  this_file <- file.path(root_dir,x)

  10.  print(this_file)

  11.  print(Sys.time())

  12.  this_table=strsplit(gsub('\\/','_', x ),"\\.")[[1]][1]

  13.  this_table

  14.  #if( this_table %in% all_tables){

  15.  if(T){

  16.    dbSendQuery(con,paste0(" drop table  if exists ",this_table))  

  17.    #sql <- paste0(" CREATE TABLE   ",this_table,

  18.    #          " (sampleID VARCHAR(25) NOT NULL,  feature_type tinyint(1) NOT NULL DEFAULT 0,  start int(10) DEFAULT NULL,  end int(10) DEFAULT NULL,   score double DEFAULT NULL,  dis int(10) DEFAULT NULL,  symbol VARCHAR(50) DEFAULT NULL,   attri VARCHAR(100)  DEFAULT NULL ,p double DEFAULT NULL,q double DEFAULT NULL, KEY idx_symbol (symbol),KEY idx_position (start,end) ) ENGINE=InnoDB DEFAULT CHARSET=latin1  "

  19.    )

  20.    #print(sql)

  21.    dbSendQuery(con,sql)

  22.    dat <- data.table::fread(this_file,stringsAsFactors = F,sep='\t',quote = "")

  23.    colnames(dat) <- c('sampleID','feature_type','start','end','score','dis','symbol','attri','p','q')

  24.    dbWriteTable(con, this_table, dat, append=T,row.names=F)

  25.    print(this_table)

  26.  }

  27. })

运行作者源代码时遇到如下报错, 经过检索发现是一个RMySQL的bug,无论你是否添加append=TRUE,他就是会报错。所以我把原先的sql语句删掉,不再事先创建数据表。

  1. Error in .local(conn, statement, ...) :

  2.  could not run statement: Table 'cistrome_human_dnase_chr1' already exists

后面也可以按照自己的需求下载对应的文件,运行上述代码将数据导入MySQL。

启动Shiny

在上述的准备之后,就可以在本地运行该Shiny应用。但是呢,这里还有一个坑,就是在作者的ui.R里面,作者居然还在里面给我藏了一个有趣的bug。

刚开始运行时,R提示了几个warnning,然后网页端里面的内容明显没有完全加载。

经过我的直觉排查,我发现作者在ui.R里面使用了中文的引号。

导致Shiny在解析时报错,因此解决方案就是替换成英文的引号,如下

使用方法就是选择IP类型,填写基因就好(这里 写的是21号染色体上的一个基因)

写在后面

(0)

相关推荐

  • phyloseq-对象构建-2-Qiime输出数据

    本文作者:xph phyloseq 对象构建 为何要使用 phyloseq 简称ps.公众号推出的多篇教程中,均使用ps对象,其可实现多种分析与可视化,无需再为数据形式而烦恼. 本次推送提供两种生成方 ...

  • 记一次MySQL中Waiting for table metadata lock的解决方法

    最近项目中的数据库查询经常挂起,应用程序启动后也报操作超时.测试人员就说数据库又挂了(貌似他们眼中的连接失败,查询无果都是挂了),通过 show processlist 一看,满屏都是 Waiting ...

  • 手把手教大家自己动手建立一个自己的博客网站

    没有前言直接开始正文,搭建一个博客需要服务器,域名,博客程序. 博客程序常用的有wordpress,z-blog,typecho等等,其中wordpress和z-blog最为简单,typecho需要一 ...

  • 手把手教你,复刻一个Gucci风格的家

    人间GUCCI 时尚圈,对潮流人士有一种赞誉叫"人间Gucci",那种离经叛道的高级感,让人过目难忘. 身着Gucci的女星达科塔·约翰逊 人气歌手Harry Styles.韩国女 ...

  • 手把手教你如何写出一个好文案

    好的广告文案可以深入人心,不时想起.举几个经典的耳熟能详的广告语:"怕上火喝王老吉"."农夫山泉有点甜"."累了,困了,喝红牛"." ...

  • 手把手教你用Python打造一个语音合成系统

    回复"书籍"即可获赠Python从入门到进阶共10本电子书大弦嘈嘈如急雨,小弦切切如私语./前言/平时我们聊天的时候,也许会想着录制一些自己的声音,而且还想有点特色,也就是所谓的变 ...

  • 手把手教你用SOLIDWORKS画一个环形电感 | 操作视频

    在设计时,工程师经常会遇到类似"环形电感"的产品,如下图所示,很多工程师对此类模型的建模较为困惑,本期和大家分享一下建模思路和过程. 环形电感建模的难点是线圈的建模,建模的方法很容 ...

  • 手把手教你在Photoshop中使用曲线工具

    这一篇我们来介绍Photoshop中曲线工具的使用方法. 首先还是打开一张图片来供我们实验: 然后我们使用快捷键Ctrl+M或者在菜单栏中依次点击"图像"?-"调整&qu ...

  • 手把手教你踩坑:老白的Docker for Windows安装初探WSL 2 backend

    2020-06-16 13:29:47  创作立场声明:老白的踩坑记录 嗨,大家好!前几日老白对Docker for Windows进行了一个初步的安装测试,总体感觉确实比较慢.在文末也提到了我的新发 ...

  • 幸运的你,可以看到一个网页工具是如何开发成功的

    一直都知道自己不擅长写代码,也实在是没有学过或者刻意锻炼过软件项目开发相关知识.但是对生物信息学来说,这些都是低频需求,除非是疯狂的热爱,一般我不会建议大家过多的关注这些`奇淫巧技`,而应该专注于科学 ...

  • 手把手教你配置VS Code远程开发工具,工作效率提升N倍

    我们厂里为了最大程度提高工程师生产力,各种研发配套工具非常的齐全,对开发人员每人都有一台云主机,而且是个人主机哦,申请就有的那种.有了云开发主机在家里或者在公司都可以随便折腾,加班也更方便了(好像哪里 ...