美文网首页生物信息学与算法Cook RR语言与统计分析
「R shiny基础」reactive让shiny应用运行速度变

「R shiny基础」reactive让shiny应用运行速度变

作者: xuzhougeng | 来源:发表于2019-02-02 23:34 被阅读53次

    对于一些小应用而言,随便写写的Shiny应用的速度其实也能凑合。但是如果你的应用涉及到很多的计算,那么如何降低不必要的运行,提高运行效率呢?

    准备

    创建一个stockVis文件夹,在其中下载如下两个文件:

    之后在stockVis的同级目录下运行runApp("stockVis"),网页会出现如下内容

    结果

    这个APP可以根据提供的股票缩写(Symbol)查询指定日期范围内的价格变动(Date Range)。我们需要在此基础上完善后面两个勾选框的功能。

    代码不足

    原来的server函数长下面这个样子:

    server <- function(input, output) {
      
      output$plot <- renderPlot({
        data <- getSymbols(input$symb, src = "yahoo",
                         from = input$dates[1],
                         to = input$dates[2],
                         auto.assign = FALSE)
    
        chartSeries(data, theme = chartTheme("white"),
                  type = "line", log.scale = input$log, TA = NULL)
      })
    }
    

    根据「R shiny基础」在shiny应用中加载数据和脚本里提到的,每次用户发生交互式,render部分的代码就会重新运行一次,也就是说上面的代码会在每次用户做了修改之后,就得重新获取数据,然后进行作图。假如有一个参数是调整标题的,那么每调整一次标题就得重头运行一遍,显然这中间获取数据可以省去。

    代码优化

    shiny提供了reactive函数,类似于render类函数,接受R的表达式作为输入,但是它只会在原始的控件(widgets)发生变化之后才会更新结果。那么本次案例中就是将原本在renderPlot获取在线获取股票数据这一步代码移动到reactive表达式中

    dataInput <- reactive({
      getSymbols(input$symb, src = "yahoo",
        from = input$dates[1],
        to = input$dates[2],
        auto.assign = FALSE)
    })
    
    output$plot <- renderPlot({    
      chartSeries(dataInput(), theme = chartTheme("white"),
        type = "line", log.scale = input$log, TA = NULL)
    })
    

    reactive函数会缓存原本的结果,当运行时发现输入并没有发生改变时就不重复计算。

    总结下reactive函数的运行步骤:

    • 当你第一次运行reactive函数后,他会在内存中存储结果
    • 下一次运行时,他会检查保存的值是否过期(也就是该数据依赖的输入是否发生变化)
    • 如果数据过期,那么重新计算,然后更新内存中保存的结果
    • 如果数据未过期,那么直接返回保存的结果,不做任何计算。

    到此,Shiny的基础知识点就结束了,后面我得写几个应用来练练手。

    传送门

    Shiny基础教程:

    相关文章

      网友评论

        本文标题:「R shiny基础」reactive让shiny应用运行速度变

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