shiny是一個R語言中的網絡應用程序框架,可以將你的數據分析變成交互式的網絡應用(web apps),簡單又實用。
基本用法
一個shiny應用可以分為兩部分:前端和后端,其實所有的shiny應用都是基於以下的模版:
ui = fluidPage() server = function(input, output) {} shinyApp(ui = ui, server =server )
其中,fluidPage中主要有兩部分:輸入函數,和輸出函數
輸入函數
輸入函數基本上都是以 *input的形式,主要有以下
- 按鈕 actionButton()、submitButton()
- 單個選框 checkboxInput()
- 一組選框 checkboxGroupInput()
- 日期輸入 dateInput()
- 日期范圍 dateRangeInput()
- 文件上傳 fileInput()
- 數字輸入 numericInput()
- 密碼輸入 passwordInput()
- 單選框 radioButtons()
- 下拉選擇框 selectInput()
- 滾動條 sliderInput()
- 文字輸入 textInput()
輸出函數,有以下幾種:
- 一個可交互表 datatableOutput()
- 原始的HTML htmlOutput()
- 圖片 imageOutput()
- 畫圖 plotOutput(),plotOutput("hist")
- 表 tableOutput()
- 文字 textOutput()
- Shiny UI元素 uiOutput()
- 文字 verbatimTextOutput()
而將輸入轉化為輸出的函數,便是server()函數了,寫server()函數有3步:
- 用output\$**來存儲要輸出的對象,例如output\$hist, 其中hist就是plotOutput中所命名的
- 用render*()來創建要輸出的對象,其中render*()函數有以下各種:renderDataTable(),renderImage(),renderPlot(),renderPrint(),renderTable(),renderText(),renderUI()
- 用input$* 來連接調用input中的參數
shiny的基本用法就是這樣了,下面是個完整的小案例:
library(shiny) ui <- fluidPage( sliderInput(inputId = "num", label = "Choose a number", value = 25, min = 1, max = 100), plotOutput("hist") ) server <- function(input, output) { output$hist <- renderPlot({ hist(rnorm(input$num)) }) } shinyApp(ui = ui, server = server)
更多的shiny應用案例見https://github.com/rstudio/shiny-examples
另外,響應表達式的兩種方法(例如用於生成一組隨機數,在不同的地方調用,保證是調用的同一組數):
- 像調用函數一樣調用響應表達式,例如:
- 反應式表達式緩存它們的值(表達式將返回其最近的值,除非它已經失效)
此外,還有一些其他可能會用到的函數:
- 將結果作為非反應性值返回:isolate({}),例如 hist(rnorm(input$num),main = isolate({input$title}))
- observeEvent()監聽事件 observeEvent(input$clicks, { print(input$clicks)}), 更多button使用方法見此(點擊)
- observe()觸發代碼在服務器上運行,使用語法與render*(), reactive(), and isolate()相同
- eventReactive()延遲按鈕事件等,用法與reactive()相同
- reactiveValues()創建一個響應值的列表來進行編程操作,例如
嵌入HTML
嵌入HTML的兩種方法:
- 用tags$*,支持很多,如a(),br(),code(),em(),h*(),hr(),img(),p(),strong()等
- 直接用HTML(" "),引號里面即為HTML的原始代碼
布局
布局的兩個主要函數:
- fluidRow()創建一行,每一個新行置於上一行的下面
- column()在一行中添加列,每一個列從左邊起,總共有12列,可用width指定需要幾列的寬度,用offset指定從左邊的偏移列數
面板布局,有以下多種:
- absolutePanel(),絕對布局
- conditionalPanel(),一個JS表達式決定是否顯示
- fixedPanel(),面板固定到瀏覽器窗口,不滾動頁面
- headerPanel(),標題面板,同pageWithSidebar()一起用
- inputPanel(),灰色背景,適用於一組輸入
- mainPanel(),顯示輸出的面板,可同pageWithSidebar()一起用
- navlistPanel(),用於顯示多個堆疊的tabPanels()面板,使用側邊欄導航
- sidebarPanel(),用於顯示輸入的側欄面板,可同pageWithSidebar()一起使用
- tabPanel(),堆疊面板,同navlistPanel(),tabsetPanel()一起使用
- tabsetPanel(),用於顯示多個堆疊的tabPanels()面板,使用側邊欄導航
- titlePanel(),標題面板,同pageWithSidebar()一起用
- wellPanel(),灰色背景的面板
還有一些預定義好的一些布局:
- sidebarLayout( sidebarPanel(), mainPanel() ),左邊標題欄,右邊是主體
- ui = fixedPage( fixedRow( column(5,#etc.) ) ),固定頁面,默認寬度是1170px
- navbarPage() 把不同的tab面板堆疊,面板欄在上部,需要title參數。內部可結合tabPanel()使用
- navbarMenu(),不同的tab的下拉菜單,可用在navbarPage內部
- dashboardPage(),來自shinydashboard包,內部同dashboardHeader()(上方標題),dashboardSidebar()(左方側欄),dashboardBody()(中間主體),更多見此
樣式
shiny所用的是Bootstrap 3 CSS框架。
嵌入css樣式有3中方法:
- 鏈接到外部的css文件
- 在你的App文件夾下創建www文件夾,並將css文件放置其中
- 然后用fluidPage()的theme屬性設置為css文件的名字,或者用tags$head進行設置,如下 tags$head( tags$link( rel = "stylesheet", type = "text/css", href = "file.css" ) )
- 在header中寫全局css樣式,例如 tags$head( tags$style(HTML(" p { color:red; } ")) ) ,或者直接用 includeCSS("file.css")
- 在tag的style屬性中添加個體的css樣式,例如 tags$h1("Title", style = "color:red;")
shiny的中文教程見此,其中有關於從客戶端獲取數據的內容。
此外,使用時shiny時經常要使用DT包展示數據表格,其常用鏈接:DT包介紹,DT的API,DT常用設置