R語言shiny包的學習


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步:

  1. 用output\$**來存儲要輸出的對象,例如output\$hist, 其中hist就是plotOutput中所命名的
  2. 用render*()來創建要輸出的對象,其中render*()函數有以下各種:renderDataTable(),renderImage(),renderPlot(),renderPrint(),renderTable(),renderText(),renderUI()
  3. 用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

 另外,響應表達式的兩種方法(例如用於生成一組隨機數,在不同的地方調用,保證是調用的同一組數):

  • 像調用函數一樣調用響應表達式,例如:

  • 反應式表達式緩存它們的值(表達式將返回其最近的值,除非它已經失效)

 此外,還有一些其他可能會用到的函數:

  1. 將結果作為非反應性值返回:isolate({}),例如  hist(rnorm(input$num),main = isolate({input$title}))
  2. observeEvent()監聽事件 observeEvent(input$clicks, { print(input$clicks)}), 更多button使用方法見此(點擊
  3. observe()觸發代碼在服務器上運行,使用語法與render*(), reactive(), and isolate()相同
  4. eventReactive()延遲按鈕事件等,用法與reactive()相同
  5. 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文件
  1. 在你的App文件夾下創建www文件夾,並將css文件放置其中
  2. 然后用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的APIDT常用設置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM