数据科学与R语言 生物信息学分析

R shiny教程-6:使用响应表达式reactive()

2020-10-04  本文已影响0人  JeremyL
stockVis app

Shiny apps构建好之后,其运行与反应要快速才会吸引用户;因此,在构建Shiny apps时,耗时计算代码的放置显得尤为重要。

#例子 - stockVis

##创建stockVis Shiny app

stockVis app

stockVis应用程序根据股票代码查找股票价格,并将结果显示为折线图。

注:注意,“为通货膨胀调整价格”复选框还不能工作。本节的任务之一是修复这个复选框。

默认情况下,stockVis会显示SPY代码(整个标普500的一个指数)。要查找不同的股票,请键入雅虎财经能够识别的股票符号。你可以在这里查看雅虎的股票代码:here。一些常见的符号是GOOG(谷歌)、AAPL (Apple)和GS (Goldman Sachs)。

stockVis非常依赖quantmod包中的两个功能:

#复选框和日期范围

stockVis应用程序使用了一些新的小部件:

#简化计算

检查当您点击“在对数尺度上绘制y轴”时会发生什么。input$log的值会改变,这会导致renderPlot中的整个表达式重新运行:

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

当renderPlot重新运行时:

这并不好,因为您不需要重新获取数据来重新绘制绘图。事实上,如果你过于频繁地重新获取数据,雅虎财经(Yahoo finance)会切断你的服务(因为你开始看起来像个爬虫机器人)。但更重要的是,重新运行getSymbols是不必要的工作,这会降低应用程序的速度并消耗服务器。

#响应表达式

可以限制在使用反应表达式的反应期间重新运行的内容。
使用reactive函数创建一个响应表达式,就像渲染render*函数。
例如,下面是一个反应式表达式,它使用stockVis的小部件从Yahoo获取数据。

dataInput <- reactive({
  getSymbols(input$symb, src = "yahoo",
    from = input$dates[1],
    to = input$dates[2],
    auto.assign = FALSE)
})

当您运行表达式时,它将运行getSymbols并返回结果。您可以通过调用dataInput()在renderPlot中使用价格数据。

output$plot <- renderPlot({    
  chartSeries(dataInput(), theme = chartTheme("white"),
    type = "line", log.scale = input$log, TA = NULL)
})

响应表达式比常规R函数更聪明一些。它们缓存数据。并知道它们的值何时已经更新。

第一次运行反应表达式时,该表达式将其结果保存在计算机的内存中。下一次调用响应表达式时,它可以返回这个保存的结果,而不进行任何计算(这会使应用程序更快)。

反应表达式只有在知道结果是最新的情况下才会返回保存的结果。如果反应表达式获悉结果已经更新了(因为改变了小部件),表达式将重新计算结果。然后返回新的结果并保存一个新的副本。反应表达式将使用这个新的副本,直到它也更新为止。

reactive()优势:

可以用reactive()来防止Shiny重新运行不必要的代码。考虑一下反应表达式将如何在下面的新stockVis应用程序中工作。

server <- function(input, output) {

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

}

当你点击“Plot y axis on the log scale”,输入input$log将改变,renderPlot将重新执行。

#依赖性

当在Shiny app修改了股票代码,Shiny 也会知道,并且重新画图。

当遇到以下两种情况,Shiny会重新运行:

可以将反应表达式看作连接,链接input和output中的对象。output中的对象将响应链中任何下游所做的更新。(可以设计一个长链,因为反应表达式可以调用其他反应表达式)

#修复 “Adjust prices for inflation”

现在来修复 “Adjust prices for inflation”,用户就能够根据通货膨胀调整的价格和未调整的价格之间切换。

server <- function(input, output) {

  dataInput <- reactive({
    getSymbols(input$symb, src = "yahoo",
        from = input$dates[1],
        to = input$dates[2],
        auto.assign = FALSE)
  })

  output$plot <- renderPlot({   
    data <- dataInput()
    if (input$adjust) data <- adjust(dataInput())

    chartSeries(data, theme = chartTheme("white"),
        type = "line", log.scale = input$log, TA = NULL)
  })
}

#总结

通过使用reactive()模块化代码,可以加快应用程序的速度.

#原文:

Use reactive expressions

系列文章:
R shiny教程-1:一个 Shiny app的基本组成部分
R shiny教程-2:布局用户界面
R shiny教程-3:添加小部件到Shiny App
R shiny教程-4:Shiny app响应式结果展示
R shiny教程-5:调用R程序和导入数据
Shiny Server安装

上一篇下一篇

猜你喜欢

热点阅读