- 1 簡介:
- 1.1 定義
- 1.2 優(yōu)缺點(diǎn)
- 1.3 架構(gòu)
- 2 ui對(duì)象包含的主要內(nèi)容
- 2.1 布局
- 2.2 控件
- 2.3 圖片
- 2.4 構(gòu)建HTML元素
- 3 交互式輸出
- 3.1 定義
- 3.2 步驟
- 3.3 ui與server的對(duì)應(yīng)關(guān)系
- 4 代碼執(zhí)行
- 5 分享應(yīng)用
- 6 案列介紹
- 6.1 案例功能
- 6.2 案例代碼分享
- 6.3 案例缺點(diǎn)
- 7 參考資料
1 簡介:
1.1 定義
- shiny 構(gòu)建交互式網(wǎng)頁 的R包累魔,
1.2 優(yōu)缺點(diǎn)
- 優(yōu)勢(shì)
- 不需要css篙贸、js等前端知識(shí)完成簡單的交互式數(shù)據(jù)可視化
- 一個(gè)人可以快速完成數(shù)據(jù)收集、處理盲厌、分析及數(shù)據(jù)可視化幾項(xiàng)工作
- 缺點(diǎn)
- 展示內(nèi)容有限俊马,輸出內(nèi)容需要在shiny中存在相應(yīng)函數(shù)
- 數(shù)據(jù)量大或者圖形復(fù)雜時(shí)琉用,計(jì)算速度慢
1.3 架構(gòu)
- 需要一個(gè)app.R腳本鱼喉,這個(gè)腳本需要三個(gè)部分:
- 一個(gè)用戶交互對(duì)象:負(fù)責(zé)網(wǎng)頁布局虐秋,部件設(shè)置等,可稱為 ui對(duì)象
- 一個(gè)服務(wù)端對(duì)象:服務(wù)器端處理數(shù)據(jù)努潘,可稱為server對(duì)象诽偷,與普通R腳本類似,區(qū)別是:嵌套在render*函數(shù)中
- 一個(gè)shinyApp函數(shù)
2 ui對(duì)象包含的主要內(nèi)容
2.1 布局
定義:網(wǎng)頁中疯坤,不同內(nèi)容擺放的位置报慕。
-
常用布局:
pageWithSidebar:邊欄布局
sidebarPanel :邊欄
mainPanel:主體部分
[圖片上傳失敗...(image-2e74b6-1586837171656)]
2.2 控件
-
定義:用戶能夠與其互動(dòng)的網(wǎng)頁元素,shiny中自帶控件:
[圖片上傳失敗...(image-4a10cd-1586837171656)]
各種控件函數(shù):
[圖片上傳失敗...(image-50b26c-1586837171658)]
-
插入控件兩個(gè)重要參數(shù):
- 部件名稱:ui與server是通過部件名稱聯(lián)系的
- 部件標(biāo)簽
2.3 圖片
- 圖片位置:該腳本的www目錄下
- 函數(shù):img eg: img(src="logo.png",height=100,width=250)
2.4 構(gòu)建HTML元素
[圖片上傳失敗...(image-7c4b4b-1586837171658)]
3 交互式輸出
3.1 定義
- 根據(jù)用戶要求輸出特定內(nèi)容
3.2 步驟
在ui對(duì)象中使用函數(shù)創(chuàng)建輸出類型
在server對(duì)象中設(shè)置如何根據(jù)輸入生成輸出
-
第一步: 在ui對(duì)象中增加輸出內(nèi)容選項(xiàng)
shiny提供了一組函數(shù)压怠,能夠在ui中返回R對(duì)象卖子。不同函數(shù)創(chuàng)建不同類型的輸出,
[圖片上傳失敗...(image-bc33dc-1586837171654)] -
在server中編寫輸出內(nèi)容
先前編寫的ui只是確定了網(wǎng)頁中哪個(gè)部分展示什么類型的輸出信息刑峡,具體如何展現(xiàn)輸出則是需要一類render函數(shù)。shiny可用render類函數(shù)如下:
[圖片上傳失敗...(image-d0b869-1586837171654)] *
3.3 ui與server的對(duì)應(yīng)關(guān)系
[圖片上傳失敗...(image-336414-1586837174233)]
4 代碼執(zhí)行
- 啟動(dòng)應(yīng)用時(shí)玄柠,Shiny會(huì)運(yùn)行一次所有的代碼
- 每有一個(gè)新的用戶運(yùn)行你的shiny應(yīng)用突梦,就會(huì)運(yùn)行一次server函數(shù),保證每個(gè)用戶有不同的響應(yīng)式對(duì)象(reactivate object)
- 每次用戶進(jìn)行交互時(shí)羽利,render部分的代碼都會(huì)運(yùn)行一次
代碼優(yōu)化:reactive函數(shù)宫患,可將一部分在render*中代碼移動(dòng)至reactive中,提高運(yùn)行速度这弧。它只會(huì)在原始的控件(widgets)發(fā)生變化之后才會(huì)更新結(jié)果娃闲,
[圖片上傳失敗...(image-27f294-1586837174233)]
5 分享應(yīng)用
兩種方法:
- 提供源代碼
- 網(wǎng)頁工具:將應(yīng)用作為網(wǎng)頁分享
1 shiny服務(wù)器
2 將shiny部署至shiny云服務(wù)中,eg:shinyapps.io
6 案列介紹
案例:
https://panyuzhang.shinyapps.io/heatmap-v2/
6.1 案例功能
- 上傳文件匾浪,依據(jù)用戶需求顯示文件皇帮、畫熱圖。
- 解決常規(guī)分析中常見的熱圖售后問題:
- 用戶更改差異條件:foldchange pvalue
- 用戶挑選基因
- 用戶挑選樣本
- 用戶挑選熱圖選項(xiàng)蛋辈,eg:聚類属拾,gene_name or transcript_id
6.2 案例代碼分享
### 功能:上傳規(guī)定格式表達(dá)量表格,根據(jù)fc,pvalue冷溶,gene_name等畫圖
options(encoding = "UTF-8")
rm(list = ls())
library(pheatmap)
library(shiny)
library(dplyr)
ui<-pageWithSidebar(
headerPanel("heatmap"),
sidebarPanel(
##上傳數(shù)據(jù)
h3("data_upload"),
fileInput('file1', 'Choose File',
accept=c('text/csv')),
tags$hr(),#加入水平線渐白,HTML的一些標(biāo)簽語法可以用tags來調(diào)用
##表格
h3("table"),
checkboxInput('header', 'Header', TRUE),
numericInput("obs","Number for obervations to view of the table:",10),
downloadButton('downloadData', 'Download'),
br(),
br(),
#熱圖
h3("heatmap"),
selectInput("name","name",c("transcript_id","gene_id","gene_name"),selected = "transcript_id"),
sliderInput("pvalue","pvalue",min = 0,max = 1,value = 0.05),
sliderInput("FC","log2(fc)",min = 0,max = 5,value = 1),
selectInput("cluster","cluster",c("yes","no"),selected = "yes"),
selectInput("exp_numbers","Exp",c("yes","no"),selected = "yes"),
sliderInput("fontisize","size",min=1,max=100,value = 8),
textInput("sample","sample",value="Enter sample,sep/,/"),
#插入圖片
img(src="logo.png",height=100,width=250)
),
mainPanel(
tabsetPanel(
tabPanel("Table",tableOutput('contents')),#表格輸出
tabPanel("fig",plotOutput("plot"))#圖片輸出
)
)
)
server<-function(input, output) {
##讀入上傳數(shù)據(jù)
datasetInput <- reactive({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
datax<-read.table(inFile$datapath, header=T,sep="\t")
})
##處理上傳數(shù)據(jù)
my_data <- reactive({
if (is.null(data()))
return(NULL)
name<-switch(input$name,
"transcript_id"=1,
"gene_id"=2,
"gene_name"=3)
tmp_dim<-dim(datasetInput())
data<-datasetInput()[,c(name,4:tmp_dim[2])]
data<-subset(data,data$pvalue < input$pvalue)
data<-subset(data,data$FC>input$FC)
})
##輸出table
output$contents <- renderTable({
if (is.null(my_data()))
return(NULL)
data<-my_data()
head(data,input$obs)
})
##輸出熱圖
output$plot<-renderPlot({
if (is.null(my_data()))
return(NULL)
clu<-switch(input$cluster,
"yes"=T,
"no"=F)
ex<-switch(input$exp_numbers,
"yes"=T,
"no"=F)
data<-my_data()
rownames(data)<-data[,1]
data<-data[,-1]
if(input$sample=="Enter sample,sep/,/"){
col<-dim(data)[2]
data<-data[,-c(col,col-1,col-2)]
pheatmap(as.matrix(data),scale="row",fontsize=input$fontisize,cluster_rows = clu,display_numbers = ex)
}else{
col<-dim(data)[2]
data<-data[,-c(col,col-1,col-2)]
dat<-data[,unlist(strsplit(input$sample,split=","))]
rownames(dat)<-rownames(data)
pheatmap(as.matrix(dat),fontsize=input$fontisize,cluster_rows = clu,display_numbers = ex)
}
})
##下載table
output$downloadData<-downloadHandler(
filename = function(){paste("table",".csv",sep="")},
content = function(file){
write.table(datasetInput(),file)
}
)
}
shinyApp(ui,server)
6.3 案例缺點(diǎn)
- 提前整理好數(shù)據(jù),數(shù)據(jù)需要符合一定格式逞频,對(duì)每列內(nèi)容及列名有要求
- 樣本順序
- 問題:兩個(gè)轉(zhuǎn)錄本對(duì)應(yīng)同一個(gè)gene_id
7 參考資料
http://www.reibang.com/p/a86ed8cbd970
https://wenku.baidu.com/view/9aa408ed4bfe04a1b0717fd5360cba1aa8118cbb.html
https://shiny.rstudio.com/tutorial/written-tutorial/lesson2/