R Shiny React 和 new.env() - 选择一组股票代码来获取数据并绘制多个 dygraphs

问题描述 投票:0回答:1

我正在尝试使用

dygraphs 
渲染多个
eapply
。相应符号的数据来自
quantmod::getsymbols
。应可通过
selectInput
选择符号(或不同的符号组)。

不幸的是,选择

selectInput
后我无法更新图表。这里有人知道应该如何处理吗?

如有任何建议,我将不胜感激!

library(shiny)
library(dygraphs)
library(quantmod)


# just for illustration purpose, the symbols may vary and the number of select values may vary. The point is, that the input to the getsymbols function are multiple tickers, that can change

sym_bols1 <- c("TSLA", "EEM", "UBS")
sym_bols2 <- c("AAPL", "MSFT")


ui <- fluidPage(
  
  fluidPage(    
    titlePanel("Multiple Tickers"),
    
    sidebarLayout(
      sidebarPanel(selectInput("symbl", "Symbolliste", c("sym_bols1", "sym_bols2"))),

      mainPanel(uiOutput("ui"))
    )
  )
)


server <- function(input, output, session) {

  data_env <- new.env(
    observe({
      quantmod::getSymbols(get(input$symbl),  from="2023-01-01", env=data_env)
    })
  )
  

  observe({
    
    dy_graph <- eapply(data_env, function(x_ts) {
      dygraphs::renderDygraph(dygraph(x_ts[, 1:4], group="multi",
                                      width=600, height=400))
    })
    
    output$ui <- renderUI(dy_graph)
  }, env=data_env)
}


shinyApp(ui = ui, server = server)

shiny quantmod shiny-reactivity r-dygraphs
1个回答
0
投票

这里有一个方法:

library(shiny)
library(dygraphs)
library(quantmod)


# just for illustration purpose, the symbols may vary and the number of select values may vary. The point is, that the input to the getsymbols function are multiple tickers, that can change

sym_bols1 <- c("TSLA", "EEM", "UBS")
sym_bols2 <- c("AAPL", "MSFT")


ui <- fluidPage(
  
  fluidPage(    
    titlePanel("Multiple Tickers"),
    
    sidebarLayout(
      sidebarPanel(selectInput("symbl", "Symbolliste", c("sym_bols1", "sym_bols2"))),
      
      mainPanel(uiOutput("ui"))
    )
  )
)


server <- function(input, output, session) {
  
  # reactive environment
  DataEnv <- reactive({
    data_env <- new.env()
    quantmod::getSymbols(get(input$symbl), from = "2023-01-01", env = data_env)
    data_env
  })
  
  Dygraphs <- reactive({
    eapply(DataEnv(), function(x_ts) {
      renderDygraph(dygraph(x_ts[, 1:4], group = "multi",
                            width = 600, height = 400))
    })
  })
  
  output$ui <- renderUI(do.call(tagList, Dygraphs()))

}


shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.