網頁開發,尤爲是交互式動態網頁的開發,是有必定門檻的,若是你有必定的R基礎,又不想過深的接觸PHP和MySQL,那R的shiny就是一個不錯的選擇。html
如今R shiny配合R在統計分析上的優點,能夠作出很是優秀的科學網站,但我見過的shiny仍是多用於本地網站搭建,由於不是每一個實驗室都能拿出大量的財力來構建公共的網站的,並且很容易形成計算資源的浪費,R shiny則充分利用了我的計算機的優點,只要安裝了基本包,就能夠運行shiny網站。java
如今個人需求是:react
一個填表網站,屬性固定,我須要一行一行的輸入。git
還要有查重的功能,已經錄入的提示不須要再錄入。github
提示我那些尚未錄入,我再一個一個的填入(覆蓋功能)。express
最後作一個基本的統計圖表。macos
過濾查找功能,提取感興趣的數據。服務器
這確定能夠用Excel作,但缺點是:app
1. 不易更新;ide
2. 不易去重;
3. 不易過濾;
4. 不易發表;
4. 時間越久表格越混亂;
參考文章:
Learn Shiny - 官網教程
Mimicking a Google Form with a Shiny app
個人 Shiny 入門學習筆記 - 生信菜鳥團
網站結構設計:
1. 輸入一個須要按期更新的table1,裏面包含咱們如今全部的信息,把「run」做爲table的key;
2. 初始化一個輸出table2,咱們填寫的值須要不斷地填入,留一個overwrite的功能;
3. 輸出一個提示table3,哪些數據咱們尚未整理,與table2同步更新;
4. 部署到網上,www.shinyapps.io;
注:
顯然table3要放在主頁,由於我要用它來填表,輸入放在底下;
table2放在分頁,底下再顯示基本的統計信息,基本的柱狀圖就行;
任何一個shiny網站都包含三個部分:ui, server, shinyApp.
library(shiny) # See above for the definitions of ui and server ui <- ... server <- ... shinyApp(ui = ui, server = server)
The user interface (ui) object controls the layout and appearance of your app.
The server function contains the instructions that your computer needs to build your app.
Finally the shinyApp function creates Shiny app objects from an explicit UI/server pair.
交互式的網頁邏輯很清楚:
在網頁上,我須要輸入數據,其實咱們輸入的是一個個的鍵值對;
當咱們填好後,請求就會到達服務器,服務器會根據輸入的鍵值對來作各類處理,最終會返回數據和圖表;
ui裏就包含了輸入的鍵值對信息,以及服務器的輸出過來了如何顯示在網頁上;
server就無所謂了,由於ui已經把輸入輸出固定死了,你能夠作任何花式處理,但你必須返回指定的輸出才能在網頁上顯示;
shinyApp就是把二者鏈接在一塊兒;
一個簡單的案例:
ui裏定義的輸入就是bins;輸出就是disPlot;
server裏就是根據現有的數據集和bins,畫了個hist;
# setwd("/Users/zxli/Dropbox/PureZ/project/singleCell/tea/shiny") library(shiny) # Define UI for app that draws a histogram ---- ui <- fluidPage( # App title ---- titlePanel("Hello Shiny!"), # Sidebar layout with input and output definitions ---- sidebarLayout( # Sidebar panel for inputs ---- sidebarPanel( # Input: Slider for the number of bins ---- sliderInput(inputId = "bins", label = "Number of bins:", min = 1, max = 50, value = 30) ), # Main panel for displaying outputs ---- mainPanel( # Output: Histogram ---- plotOutput(outputId = "distPlot") ) ) ) # Define server logic required to draw a histogram ---- server <- function(input, output) { # Histogram of the Old Faithful Geyser Data ---- # with requested number of bins # This expression that generates a histogram is wrapped in a call # to renderPlot to indicate that: # # 1. It is "reactive" and therefore should be automatically # re-executed when inputs (input$bins) change # 2. Its output type is a plot output$distPlot <- renderPlot({ x <- faithful$waiting bins <- seq(min(x), max(x), length.out = input$bins + 1) hist(x, breaks = bins, col = "#75AADB", border = "white", xlab = "Waiting time to next eruption (in mins)", main = "Histogram of waiting times") }) } shinyApp(ui = ui, server = server)
小技巧:
1. 如何輸入文件?
fileInput
2. 如何顯示數據?
默認的會把整個table都顯示,顯然DT的格式更美觀,還能夠排序過濾。
DT::dataTableOutput
DT::renderDataTable
3. 如何改變佈局?
sidebarLayout很實用,但能夠改變;常見佈局並很少,參見官網:Application layout guide
4. 如何提交數據?
textInput
5. 有哪些好看的主題?
shinydashboard這個佈局比較高大上。
library(devtools) install_github("nik01010/dashboardthemes")
6. 如何解決rJave問題?
先安裝java8,而後sudo R CMD javareconf。參考:rJava fails to load #2254
macos去/Library/Java/JavaVirtualMachines/裏面把以前的版本給卸載了。
stdio.h的問題就得去/Library/Developer/CommandLineTools/Packages/把包再裝一遍。
怎麼搞都搞很差,最後發現默認的rJava是依賴jdk11.0.1的,裝了對應版本,世界瞬間清淨了。
7. 如何下載table?
downloadHandler
高級語法
「R shiny基礎」reactive讓shiny應用運行速度變快
用內存換速度,原來每有一點變更就從新計算全部結果,如今把部分結果放在內存中,除非指定的發生變化,不然不會從新計算。
isolate隔離
正常狀況下,一旦參數發生變化,就必然會更新結果,isolate則只在激活按鈕時才生效。
Use isolate() to avoid dependency on input$obs
observe
相似reactive,可是沒有輸出值。
renderUI
第二個R shiny的網站app
主要功能:
1. 用詞雲展現核心的信息,table呈現meta信息;
2. 用戶搜尋本身感興趣的樣本,導出樣本信息;
3. 用戶查找感興趣的基因,導出感興趣的基因在特定組織、處理中的表達;
4. 精確查找meta信息,整合作meta RNA-seq分析,DEG獲取;
5. 常規pipeline分析;