分享

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

 生物_医药_科研 2019-02-03

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

准备

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

  • app.R  - helpers.R

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

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

代码不足

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

  1. server <> function(input, output) {


  2.  output$plot <> renderPlot({

  3.    data <> getSymbols(input$symb, src = 'yahoo',

  4.                     from = input$dates[1],

  5.                     to = input$dates[2],

  6.                     auto.assign = FALSE)


  7.    chartSeries(data, theme = chartTheme('white'),

  8.              type = 'line', log.scale = input$log, TA = NULL)

  9.  })

  10. }

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

代码优化

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

  1. dataInput <> reactive({

  2.  getSymbols(input$symb, src = 'yahoo',

  3.    from = input$dates[1],

  4.    to = input$dates[2],

  5.    auto.assign = FALSE)

  6. })


  7. output$plot <> renderPlot({    

  8.  chartSeries(dataInput(), theme = chartTheme('white'),

  9.    type = 'line', log.scale = input$log, TA = NULL)

  10. })

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

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

  • 当你第一次运行 reactive函数后,他会在内存中存储结果

  • 下一次运行时,他会检查保存的值是否过期(也就是该数据依赖的输入是否发生变化)

  • 如果数据过期,那么重新计算,然后更新内存中保存的结果

  • 如果数据未过期,那么直接返回保存的结果,不做任何计算。

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

传送门

Shiny基础教程:

  • 「R shiny 基础」初识Shiny

  • 「R shiny 基础」如何进行网页布局

  • 「R shiny基础」增加一些小控件

  • 「R shiny基础」交互式入门

  • 「R shiny基础」在shiny应用中加载数据和脚本

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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多