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包中的两个功能:
- getSymbols: 直接从雅虎财经和圣路易斯联邦储备银行等网站下载金融数据。
- 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
甜言蜜语最危险的
很多人看不开,也不体面
因小失大