戳上面的藍字關注我們哦!
作者:科研貓 | 小獵豹
對於做生物信息開發的人來說,當你辛辛苦苦開發了一個程序,你的想法是什麼?肯定是想要更多的人去使用它。那麼如何才能使得你的程序人盡皆知呢?其中最重要的一點就是提高程序的易用性,需要充分考慮到你的用戶群體。
在日常的科研工作當中,R語言成為一個越來越重要的工具。越來越多的R包和基於R的工具被開發出來,使用R的人也是越來越多。作為一名開發人員,當你開發了一個工具的時候,你的想法是讓他幫助到更多的人。
可是你有沒有想過,在眾多的科研人員中,懂得使用SPSS以及graphpad的人都是少數人,那麼能夠靈活運用R語言的人就更加少之又少了。不管你的工具開發的再好,你仍然需要面對一個無法辯駁的事實,依然很少有人會去用它。這就是我們所說的,「酒香也怕巷子深」。
還有一種情形,我們在臨床上經常遇到這樣的問題,比如在臨床實踐中經常遇到的一些小計算,像BMI、體表面積、平均動脈壓、eGFR、或者類似CURB65評分等等,這樣的計算在臨床上每天都在發生,大多數人會自己在腦子裡記下公式,然後掏出手機算一算。
可是人腦的記憶力畢竟是有限的。有沒有可能自己寫一個計算公式來完成這些簡單的計算呢?當然是可以的。這些計算在程序語言中只是簡單的加減乘除,非常容易實現。可是我們總不能在遇到計算的時候,把電腦掏出來用R語言去跑一遍吧。那有沒有什麼快捷簡便的方法可以幫我們去實現這些簡單的計算,同時又擺脫複雜的計算環境呢?
這個時候很多人的腦子裡都會浮現出來這樣一個想法:手機APP或者網頁工具。如果我們可以把這些計算公式都事先封裝在一個APP中或者網頁工具中,在真正計算的時候,我們只需要把需要的數值代入進去,即可獲得最終的結果。比如一個在線的BMI指數計算工具。有沒有覺得這樣的想法非常的靠譜呢。比如像這樣子的,一個簡單的網頁就可以解決這個問題。可以毫不誇張的說,如果一個程序做成R包,面對的用戶是10個人,那麼做成網頁應用,面對的用戶可能有1000個人。
那麼如何來實現這樣的操作呢?對於網頁工具稍有涉獵的人都知道,涉及到網頁工具就會涉及到非常多的基礎的程式語言。比如HTML,CSS.,Javascript. 除了這些前端的內容。我們還要學習後端的很多東西。比如最老套的LAMP。Linux + Apache + MySQL/MariaDB + PHP/Perl/Python,當然後臺的程式語言也可以用Golang或者是Java等等。
雖然說現在有很多現成的框架可以幫我們又快又好的去搭建一個網站,比如前端的Bootstrap,Vue, React以及後臺的Django,Flask等等,但是這些框架往往非常的龐大,而且不易學習。為了一些簡單的計算而使用這麼龐大的系統去搭建的話,會浪費我們大把的時間在學習上面,對於專注於計算和數據研究的人來說非常的不友好。
在前面很多次的教程中,我們不止一次的說過,R語言對於需要做數據分析的人來說,是極其重要的一個工具。我們很多文章和教程裡面的乾貨也都是R語言的代碼。那麼有沒有什麼好的工具可以幫助我們,單純使用R語言就可以快速開發一個網頁呢?當然有,這就是Shiny。
Shiny包是RStudio開發的,可以快速搭建基於R的交互網頁應用。Shiny包的特點在於不需要了解網頁語言,用純R來搭建。生成的網頁應用是動態交互、即時更新的。通過shiny交互網頁應用,你可以:
不需要安裝任何程序, 攜帶數據, 只要有網的地方, 就能使用。
只要你安裝一次, 就可以讓別人試用,無需別人安裝調試環境。
不用擔心軟體或者代碼洩密, 可以控制用戶使用時間和權限。
通過交互式操作,在數據分析中減少重複的工作。
整體來說,Shiny是使用R代碼創建Web應用程式的框架。它的設計首先考慮了數據科學家,為此,您可以創建非常複雜的Shiny應用程式,而無需了解HTML,CSS或JavaScript。另一方面,Shiny並不僅限於創建簡單或預製的應用程式:它的用戶界面組件可以輕鬆地自定義或擴展,其伺服器使用反應式編程來創建所需的任何類型的後端邏輯。入門時,Shiny的設計使你感覺上很神奇,但是,深入了解它的工作原理後,您會越意識到,它是由具有強大軟體工程原理的通用構建模塊構建而成的。
如今,與R本身一樣,Shiny在幾乎所有細分市場和行業中都得到了使用。它在學術界用作統計概念的教學工具,是一種用於炫耀新穎的統計方法或模型的媒介,大型製藥公司使用它來加快藥物開發過程中科學家與分析師之間的協作,科技公司使用它來建立運行高級分析的實時控制臺。例如在Hiplot網站中的大量shiny高級應用一樣,我們可以通過shiny來實現非常複雜絢麗的網頁展示。例如在Hiplot網站中,由openbiox開發和維護的TCGA XenaShiny項目,其功能就十分完善。
本次教程旨在幫助大家對Shiny進行更深入的了解。希望大家在學習後,能夠編寫具有更多自定義用戶界面,更多可維護代碼以及更好的性能和可伸縮性的應用。下面我們先來一個例子,先睹為快。
1library(shiny)
2
3#ui
4ui <- fluidPage(
5 titlePanel("Calculate Body Mass Index (BMI)"),
6
7 sidebarLayout(
8 sidebarPanel(
9 p("This tool calculates the BMI by using fomular:"),
10 p("BMI = Weight(kg) / Height(m) ^ 2"),
11 br(),
12
13 numericInput(inputId = "weight",label = "Enter body weight (kg)",value = 75,min = 0,max = 500,step = 1),
14 numericInput(inputId = "height",label = "Enter body height (cm)",value = 180,min = 0,max = 300,step = 5)
15
16 ),
17 mainPanel(
18 p("According to your input, the BMI is:"),
19 textOutput(outputId = "bmi")
20 )
21 )
22)
23
24#server
25server <- function(input, output, session) {
26 output$bmi <- renderText({
27 bmi = input$weight / ((input$height / 100) ^ 2)
28 sprintf("%2.4f kg/m2",bmi)
29 })
30}
31
32# run app
33shinyApp(ui, server)
就這樣簡單的幾十行R代碼,在RStudio中直接點擊運行後,結果是這樣的,大家可以在自己的RStudio中試一試,這種滿足感是非常奇特的:
這期教程中關於shiny的初步介紹,我們就講到這裡。後面我們將會給大家講解關於R的Shiny應用的一系列內容,由淺入深,也會邀請大咖給大家解讀自己的shiny代碼。下期內容我們將詳細的解讀關於shiny的基礎,帶領大家來一步步書寫R語言的shiny應用。