2020-04-02 Rshiny 案例分享

  • 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)]

    image.png

2.2 控件

  • 定義:用戶能夠與其互動(dòng)的網(wǎng)頁元素,shiny中自帶控件:
    [圖片上傳失敗...(image-4a10cd-1586837171656)]

    image.png

各種控件函數(shù):
[圖片上傳失敗...(image-50b26c-1586837171658)]

image.png
  • 插入控件兩個(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)]

image.png

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)]

    image.png
  • 在server中編寫輸出內(nèi)容
    先前編寫的ui只是確定了網(wǎng)頁中哪個(gè)部分展示什么類型的輸出信息刑峡,具體如何展現(xiàn)輸出則是需要一類render函數(shù)。shiny可用render類函數(shù)如下:
    [圖片上傳失敗...(image-d0b869-1586837171654)] *

    image.png

3.3 ui與server的對(duì)應(yīng)關(guān)系

[圖片上傳失敗...(image-336414-1586837174233)]

image.png

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)]

image.png

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/

http://yanping.me/shiny-tutorial/#hello-shiny

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纯衍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苗胀,更是在濱河造成了極大的恐慌襟诸,老刑警劉巖瓦堵,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異励堡,居然都是意外死亡谷丸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門应结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刨疼,“玉大人,你說我怎么就攤上這事鹅龄】剑” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵扮休,是天一觀的道長迎卤。 經(jīng)常有香客問我,道長玷坠,這世上最難降的妖魔是什么蜗搔? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮八堡,結(jié)果婚禮上樟凄,老公的妹妹穿的比我還像新娘。我一直安慰自己兄渺,他們只是感情好缝龄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挂谍,像睡著了一般叔壤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上口叙,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天炼绘,我揣著相機(jī)與錄音,去河邊找鬼妄田。 笑死饭望,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的形庭。 我是一名探鬼主播铅辞,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼萨醒!你這毒婦竟也來了斟珊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤富纸,失蹤者是張志新(化名)和其女友劉穎囤踩,沒想到半個(gè)月后旨椒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堵漱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年综慎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勤庐。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡示惊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愉镰,到底是詐尸還是另有隱情米罚,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布丈探,位于F島的核電站录择,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碗降。R本人自食惡果不足惜隘竭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讼渊。 院中可真熱鬧货裹,春花似錦、人聲如沸精偿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笔咽。三九已至,卻和暖如春霹期,著一層夾襖步出監(jiān)牢的瞬間叶组,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工历造, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甩十,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓吭产,卻偏偏與公主長得像侣监,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臣淤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 課程1 1.1. Rshiny作用: 可以將數(shù)據(jù)分析變成互動(dòng)性網(wǎng)絡(luò)應(yīng)用 1.2. shiny 應(yīng)用結(jié)構(gòu) 一個(gè)用戶界...
    Bio小盼閱讀 619評(píng)論 0 0
  • 注: 所有命令都要切換到 root 用戶下執(zhí)行,通過 sudo su 命令可切換到 root 用戶 ,這樣就不需要...
    余帶鹽閱讀 2,307評(píng)論 0 4
  • 衛(wèi)生紙的價(jià)格越來越低 所以我查了下資料 然后 我假裝自己沒查過資料 我本以為我很難假裝 可是我很平靜的接受
    沉沉不語閱讀 284評(píng)論 0 0
  • 我已經(jīng)不再看什么雞湯文橄霉,即使我自己莫名其妙的在寫著些什么公眾號(hào)關(guān)注著,未讀消息是幾十上百條了邑蒋,但是我不忍心取關(guān)人家...
    三金二木夕閱讀 291評(píng)論 1 1
  • 離中秋節(jié)還有兩個(gè)月姓蜂,走到哪都在宣傳月餅了按厘。特別是每天上下班公交車上,播音員播站點(diǎn)的時(shí)候钱慢,還不忘加上一句“xx月餅提...
    遇見你是我最美的憧憬閱讀 241評(píng)論 4 1