把数据整理和画图代码嵌入shiny

之前师兄把数据整理和画图的代码给了我,由此开始了漫长的挣扎之路...
一开始,他说用source来直接source整段代码进server.R中,但是我到现在都还没有搞懂怎么source
既然不会就只能用笨方法了,直接复制粘贴到server里面吧!要把直接在Rstudio中跑的代码变成app中里面的一个功能,首先要做的就是把固定的文件替换成用户上传的文件,试验中就是input$file1啦。所以,首先先把数据整理的一段代码复制到server里面:

library("readr")
library(Biobase)
source("D:/Hard work/R_function.R")
options(stringsAsFactors=F)


########cut off init
p_value <- 0.05 # p value of FDR
lfc <- 0.58  #logFC
args <-commandArgs(T)
args[1] <- input$file1

########load data
countData1 <- as.data.frame(read_delim(args[1],delim = "\t"))
dim(countData1)
rownames(countData1) <- countData1$id
countData=countData1[,-1]

###########pheno data loading
colData <- get_pheno(x = colnames(countData),label1 = "T",label2 = "N",group1 = "Tumor",group2 = "Normal")
countData <- countData[,as.character(rownames(colData))]
colData$Type <- as.factor(colData$Type)
type_level <- levels(as.factor(colData$Type))
comb <- combn(type_level,2)

#########filter low-abandance circRNA ; the step has been done in node1:filter_circ
# countData <- countData[which(rowSums(countData > 0) >= 2),] #a Count>0 in at least 2 samples
# dim(countData)

# ###############type specific

##############edgeR
#source("./R_function.R")

#sharedCirc_edgeR_tmp <- edgeR_test(expre_mat = shared_circ,group_mat = colData,test_method = "LRT" )
sharedCirc_edgeR <-edgeR_test(expre_mat = countData,group_mat = colData)

DE_sharedCirc_res = subset(sharedCirc_edgeR,FDR <= p_value & abs(logFC) >= lfc)
select <- DE_sharedCirc_res[order(DE_sharedCirc_res$logFC, decreasing = TRUE),]
Circ_norm_edgeR=cpm(countData) ###norm expres_mat
rownames(Circ_norm_edgeR)=countData1$id
sharedCirc_DE_edgeR=Circ_norm_edgeR[rownames(select),]
#all DE
DE_list <- c(rownames(DE_sharedCirc_res))

然而发现自己太年轻,系统直接报错,找不到“input”,想了一下这不是废话吗,刚打开怎么会有input,然后要别人怎么整理数据嘛
所以我就想着弄一个条件语句,把数据整理打包成一个功能,且在有input的时候才会动,至于有没有必要打包成一个功能,还要靠后面试验一下。
想来想去觉得一时半会想不出来,所以先试一下最笨的方法:在每个tab的output代码里都加进这一段,只不过是最后图不一样而已
所以拿火山图试了一下,代码是

output$dmplot <- renderPlot{
    if(is.null(input$file2)){return()}
    ...
    args[1] <- input$file2$datapath
    ...
    volcanoplot()
}

实际上,最重要的是中间args[1]那一句,通过这个方法, 结果是可行的,只不过终于明白了当初加进度条的目的,实在是太慢了。而且如果每个模块的每个tab里面都塞这么一段代码的话,整个应用的速度会不会被严重拖慢,这都是要考虑的问题。现在再尝试一下把它弄整洁一点。
可能可以在每一个模块前面加一个reactive()

解决方案①(只能完成但是不能控制):

output$dmplot <- renderPlot({
    if(is.null(input$file2)){return()}
    ########cut off init
    p_value <- 0.05 # p value of FDR
    lfc <- 0.58  #logFC
    args <-commandArgs(T)
    #args[1] <- "matrix/11_7//filter_input_count.mat"
    args[1] <- input$file2$datapath
    
    ########load data
    countData1 <- as.data.frame(read_delim(args[1],delim = "\t"))
    dim(countData1)
    rownames(countData1) <- countData1$id
    countData=countData1[,-1]
    
    ###########pheno data loading
    colData <- get_pheno(x = colnames(countData),label1 = "T",label2 = "N",group1 = "Tumor",group2 = "Normal")
    countData <- countData[,as.character(rownames(colData))]
    colData$Type <- as.factor(colData$Type)
    type_level <- levels(as.factor(colData$Type))
    comb <- combn(type_level,2)
    
    
    sharedCirc_edgeR <-edgeR_test(expre_mat = countData,group_mat = colData)
    
    DE_sharedCirc_res = subset(sharedCirc_edgeR,FDR <= p_value & abs(logFC) >= lfc)
    select <- DE_sharedCirc_res[order(DE_sharedCirc_res$logFC, decreasing = TRUE),]
    Circ_norm_edgeR=cpm(countData) ###norm expres_mat
    rownames(Circ_norm_edgeR)=countData1$id
    sharedCirc_DE_edgeR=Circ_norm_edgeR[rownames(select),]
    #all DE
    DE_list <- c(rownames(DE_sharedCirc_res))
    volcano_plot(sharedCirc_edgeR,c("Normal","Tumor"))
  })

当上传了文件,就开始算,但其实这个最后是不可行的,因为:1. 到时可能会上传多个文件;2. 没有控制按钮是不行的,你以为想画图就画?
解决方案②(添加actionButton()):
然后失败了
解决解决方案②:用eventReactive()对pl赋值,并用actionButton进行控制,然后直接在renderPlot()中写上pl(),就可以生成图表。这样起码可以在每个tab中加上一个开始按钮,然后需要时再计算画图,每个tab之间相互独立,但是这样的坏处是,每作一张图就要重复计算数据,很不必要并且浪费时间。不过怎么说总算有了一种可行的方法。
解决方案③(最完美):
只用reactive():先用一个example把需要计算的文件位置占住,使得不会报错,然后再通过conditionalPanel来实现上传文件的切换,这样就不用考虑先后顺序的问题。上传和计算的部分用reactive分开,最后用list返回多个对象,给下面作图做准备。但是这样做的缺点是一打开那个页面它就会自动运算,比如想直接上传文件计算,还要等example先算一遍。所以有一个更加独立封闭的方法。
eventReactive():上传文件部分不变,计算部分加一个控制的actionButton(),在按下按钮之后才会开始运算,这样就会提高网站的速度。
例如:

dmdataprocess <- eventReactive(input$dmbutton,{
....
 plots <- list(a=sharedCirc_edgeR, b=DE_sharedCirc_res, c=colData,  d=Circ_norm_edgeR, e=sharedCirc_DE_edgeR, f=DE_list)
    return(plots)
})

接着,在下面画图时,需要用到的参数就可用dmdataprocess()$a诸如此类的表达来表示,注意,因为dmdataprocess是在eventReactive表达中,因此结构是和函数一样的,所以用的时候要在后面加一个括号。通过这样处理,运算一次便可以生成三张图。
其实较早之前就能正确运用eventReactive了,但是过了这么久才解决,总结这次经验就是:函数的默认返回值是最后一行,用list()返回多个对象(所以为什么这么简单的事情困扰了这么久)

actionButton()触发画图时,用observeEvent()配合

observeEvent(input$qcbutton,{
    output$qcdistri <- renderPlot({
      distribution_plot(m6A_anno = qcdatasetinput())
    })
  })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容