美文网首页网站
shiny的介绍及使用

shiny的介绍及使用

作者: 一只烟酒僧 | 来源:发表于2020-10-18 23:13 被阅读0次

    shiny cheatsheet:https://shiny.rstudio.com/articles/cheatsheet.html
    shiny官网第一节:https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/
    shiny是一个用于开发交互APP的R包,通过它,我们可以将写的R代码包装成一个网页APP,用户可以通过与网页交互的方式进行无代码的操作,这样可以节省用户的时间,同时加速开发端与用户端交流的速度。
    示例:

    library(shiny)
    runExample("01_hello")
    

    shiny app的所有代码被写入了一个脚本中,这个脚本主要由三部分组成1、定义用户界面的对象(网页的门面) 2、服务端运行的函数(网页内在运行的逻辑)3、shinyapp() (用于启动ui和server)。
    在使用时,需要保证该脚本(app.R)在某个路径(如newdir/)下,通过运行runAPP("newdir)启动应用
    在之前的旧版中,ui与server必须分开写入两个脚本(ui.R,server.R),放入一个文件夹内,而在新版中,写在两个脚本和一个脚本中均可,写在一个脚本中可以方便用户启动代码或与别人交流代码。

    UI的结构

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

    注:可以发现:page>layout>panel>action module
    任何一部分都可以独立成一个结构

    server的结构

    # 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")
    
        })
    
    }
    

    注意:我们可以发现,
    1、server中的input,都是在ui中起输入功能的module的名字,而output,都是对应ui中起output功能的module的名字,因此,server的本质就是将ui中输入的内容,通过一系列函数变换,转化为我们想要的输出格式
    2、为了保证app与用户的交互功能,我们需要在用户更新输入数据时及时响应改变,因此对于变化的内容一般都要用到render*(对于图表)和reactive(对于数据)函数。

    ?reactive
    Wraps a normal expression to create a reactive expression. Conceptually, a reactive expression is a expression whose result will change over time.#将普通的表达式转化成随时间更新的表达式
    `reactivePlot` has been replaced by `[renderPlot()](http://114.212.200.51:3838/help/library/shiny/help/renderPlot)`.
    
    `reactiveTable` has been replaced by `[renderTable()](http://114.212.200.51:3838/help/library/shiny/help/renderTable)`.
    
    `reactivePrint` has been replaced by `[renderPrint()](http://114.212.200.51:3838/help/library/shiny/help/renderPrint)`.
    
    `reactiveUI` has been replaced by `[renderUI()](http://114.212.200.51:3838/help/library/shiny/help/renderUI)`.
    
    `reactiveText` has been replaced by `[renderText()](http://114.212.200.51:3838/help/library/shiny/help/renderText)`.
    
    ?renderPlot
    Renders a reactive plot that is suitable for assigning to an output slot.
    

    我们把上述shiny的特性称为reactivity


    image.png

    用户可以利用reactivity这类特性做更加灵活的交互展示


    image.png

    一个shiny-app的基本结构


    image.png

    输入的action module汇总

    actionButton
    actionLink
    checkboxGroupInput
    checkboxInput
    dateInput
    dateRangeInput
    fileInput #如果你想用这个模块,务必读一下它的说明文档,它读进来的是一个list对象!!
    numericInput
    passwordInput
    radioButtons
    selectInput
    sliderInput
    submitButton
    textInput
    

    输出的函数汇总(左边是server中的render(等同于reactive+output),右边是ui中的*output函数)

    image.png

    shiny中的panel和layout,用于调整action module的排列方式


    image.png

    注意!!!一个容易出错的地方!!!多次在这边出问题!

    iris_input<-reactive({
          input$test
        })
    output$text2=renderText({iris_input})
    #上述为错误案例,正确的为
    iris_input<-reactive({
          input$test
        })
    output$text2=renderText({iris_input()})
    #解释,reavtive或render*是将普通表达式变成reactive表达式,以一个function的形式返回,因此要加括号!
    

    小技巧1:actionbutton+isolate可以避免reactive频繁刷新

    output$mattab<-renderTable({
        
        input$start
        isolate(mat()[1:6,1:6])
        
        },rownames = T)
    #解释:isolate可以屏蔽mat()反应式改变引起的reactive,而如果input$start改变,则会重新运行 isolate(mat()[1:6,1:6])!
    

    小技巧2:shiny的reactive中存在两个可以帮助你跳出reactive的函数--observeEvent和observe() (注:isolate()是阻止reactive,不是跳出reactive)

    observeEvent(input$create.proj,{get_shiny_local(input$proj.name)})
    #前一个参数如果发生改变,那么会执行第二个参数的内容,第二个参数可以是reactive表达式,也可以是普通表达式!
    #这种情况适用于,我们希望做一些保存或者部分结果不想展示出来的时候
    

    小技巧3:由于actionbutton在使用的时候是由null变化为0,因此如果我们使用{input$actionbutton ;isoloat(expr)},会在shiny启动的时候有报错的小bug(因为此时isolate中的expr都没有赋值,所以会报错),类似下图


    image.png

    解决这一问题我们可以通过设置actionbutton的取值来解决,如:

    if(input$start==0){NULL}else{
          chromatogram(seq(), width = 200, height = 2, showcalls = "both")
        }
    
    修改后

    小技巧4:shiny上传文件是有最大限制的,一般最大为5M,如果超过了会报错,解决办法是在app.r中加入options(shiny.maxRequestSize = 30 * 1024 ^ 2),可以将上传限度调整到30M,依次类推。
    参考链接:http://www.dovov.com/shinyx.html

    小技巧5:在使用fileinput actionmodule的时候,需要提供接受的文件类型,可以参考下面链接进行填写:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

    小技巧6:影响shinyapp与用户交流体验的一大原因是文件的上传和下载,尤其是大文件的上传和下载,因此,这两个过程尽量采取压缩文件的方式进行。如600M的csv文件经过压缩后仅为14M

    相关文章

      网友评论

        本文标题:shiny的介绍及使用

        本文链接:https://www.haomeiwen.com/subject/hkkcmktx.html