R海拾遗-shiny4

时间:2022-07-25
本文章向大家介绍R海拾遗-shiny4,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

R海拾遗-shiny4

概述

shiny基础终章,shiny反应表达式学习

代码

在工作目录中创建一个名为stockVis的新文件夹 下载以下文件放在stockVis中 app.R:https://shiny.rstudio.com/tutorial/written-tutorial/lesson6/stockVis/app.R helper.R:https://shiny.rstudio.com/tutorial/written-tutorial/lesson6/stockVis/helpers.R 使用runApp启动应用程序runApp("stockVis")

setwd("D:\360MoveData\Users\cmusunqi\Documents\GitHub\R_and_python\R")
library(shiny)
runApp("stockVis")

结果

这个stockvis展示的内容

  • 选择一只股票
  • 选择日期展示
  • 选择是否将x轴log转换
  • 是否通过通货膨胀对股票价格进行调整

默认情况下,stockVis会显示SPY代码(整个标普500的指数)。要查找不同的股票,请键入雅虎财经能够识别的股票符号。如GOOG(谷歌)、AAPL (Apple)和GS (Goldman Sachs)

注意到的一点是目前默认的app展示时的adjust prices for infaltion 目前是不可选的状态

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

  1. getSymbols: 直接从雅虎财经和圣路易斯联邦储备银行等网站下载金融数据。
  2. chartSeries 图表中显示价格

同时需要使用helps.r脚本,脚本包含一个根据通货膨胀调整股票价格的函数。

解析app.r包

# 导入包
library(shiny)
# 导入需要计算的函数
library(quantmod)

# 导入计算通货膨胀的函数 ----
source("helpers.R")

#ui函数编写
ui <- fluidPage(
    # 标题
  titlePanel("stockVis"),
  # 工具条设计
  sidebarLayout(

    sidebarPanel(
        # 帮助文本
      helpText("Select a stock to examine.
        Information will be collected from Yahoo finance."),
        # 输入文本
      textInput("symb", "Symbol", "SPY"),
        # 日期选择框
      dateRangeInput("dates",
                     "Date range",# 框名
                     start = "2013-01-01",
                     end = as.character(Sys.Date())),
      br(),
      br(),
    #   复选框
      checkboxInput("log", "Plot y axis on log scale",
                    value = FALSE),
    # 复选框
      checkboxInput("adjust",
                    "Adjust prices for inflation", value = FALSE)
    ),
    # 主要绘图区域
    mainPanel(plotOutput("plot"))
  )
)

# 服务代码
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)
  })

}

# 运行
shinyApp(ui, server)

目前的程序有个问题,当你选择第一个框的时候,shiny会重新从雅虎获得数据,相当于运行了下面的程序,并重新绘制图片,这可能会导致运算变慢,同时雅虎会认为数据异常,从而封闭访问

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

因此需要使用到反应表达式

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

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

添加代码使得第二个复选框工作

server <- function(input, output) {

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

  finalInput <- reactive({
    if (!input$adjust) return(dataInput())
    adjust(dataInput())
  })

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

结束语

反应表达式reactive({}),提高计算效能,到这里基本上关于shiny的基础教程已经更新完毕,后续看看有没有大的项目玩一玩,可惜最近服务器不给力,深度学习的东西没法开展,就说这么多吧,love&peace

甜言蜜语最危险的 很多人看不开,也不体面 因小失大