我正在使用highcharter软件包在R-Shiny项目上绘制财务时间系列,我希望允许用户在图表上添加指标(例如移动平均线)。为了做到这一点,我在服务器端的hc_add_series_xts()
语句中调整了if
。它工作正常,但每次有人添加一个指标,图表完全重新加载,而我更喜欢动态更新。有没有办法实现呢?
为了更好地解释我的情况,它遵循单页Shiny示例:
library(shiny)
library(quantmod)
library(highcharter)
library(TTR)
ui <- fluidPage(
mainPanel(
highchartOutput("hc"),
checkboxInput("indicator","Add Moving Average")
)
)
server <- function(input, output) {
output$hc <- renderHighchart({
y <- getSymbols("MSFT", auto.assign=FALSE)
hc <- highchart() %>%
hc_exporting(enabled = TRUE)%>%
hc_add_series_ohlc(y) %>%
hc_add_theme(hc_theme_538(colors = c("red", "blue", "green"),
chart = list(backgroundColor = "white") ))
if(input$indicator){hc <- hc %>% hc_add_series_xts(name = "Moving Average", EMA(Cl(y)))}
return(hc)
})
}
shinyApp(ui = ui, server = server)
PS:我故意将所有历史价格称为可用的,以便让人感觉到“完整的真实”事件。
答案 0 :(得分:1)
目前无法使用shiny
更新图表,如您所见,绘制新图表。
你试过hc_legend(enabled = TRUE)
吗?因此,您可以显示或隐藏点击图例的系列。
hc <- highchart() %>%
hc_exporting(enabled = TRUE)%>%
hc_add_series_ohlc(y) %>%
hc_add_theme(hc_theme_538(colors = c("red", "blue", "green"),
chart = list(backgroundColor = "white") )) %>%
hc_add_series_xts(name = "Moving Average", EMA(Cl(y)), visible = FALSE) %>%
hc_legend(enabled = TRUE)
hc
希望这个帮助
答案 1 :(得分:0)
以你的例子为例,jbkunst方法比我的好得多。特别是因为图形的渲染(在ui
中)比建立它所花费的时间长得多(在server
中)。
但是在某些情况下,将基本对象加载到server
函数的变量中,然后在选择它们时仅添加新指标的解决方案可以改善延迟:
server <- function(input, output) {
y <- getSymbols("MSFT", auto.assign=FALSE)
hc <- highchart() %>%
hc_exporting(enabled = TRUE)%>%
hc_add_series_ohlc(y) %>%
hc_add_theme(hc_theme_538(colors = c("red", "blue", "green"),
chart = list(backgroundColor = "white") ))
output$hc <- renderHighchart({
hc_now <- hc
if(input$indicator){hc_now <- hc_now %>% hc_add_series_xts(name = "Moving Average", EMA(Cl(y)))}
return(hc_now)
})
}
首次加载需要一段时间,但更改指标需要的时间更少