Построение нескольких символов с помощью реактивного оператора с помощью chartSeries

Я новичок в Shiny и закончил учебник по Shiny здесь: http://shiny.rstudio.com/tutorial/ < / а>

В уроке 6 учебное пособие показывает нам, как создать приложение, в котором вы вводите символ акции и диапазон дат, чтобы увидеть его график на главной панели.

Я пытаюсь пойти немного дальше, изменив приложение на то, которое принимает 2 символа акций и рисует их на одном графике, сравнивая их во времени (перекрываясь на одном графике).

Я изменил server.R, чтобы он был:

library(quantmod)

shinyServer(function(input, output) {



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


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

и мой uiR должен быть:

library(shiny)

shinyUI(fluidPage(
  titlePanel("StockComp"),

  sidebarLayout(
    sidebarPanel(
      helpText("Select two stocks and a time frame to compare. 
        Information will be collected from yahoo finance."),

      textInput("symb1", "1st Stock Symbol", "GOOG"),
      textInput("symb2", "2nd Stock Symbol", "AAPL"),

      dateRangeInput("dates", 
        "Date range",
        start = "2012-01-01", 
        end = as.character(Sys.Date())),

      actionButton("get", "Compare Stocks"),

      br(),
      br(),

      checkboxInput("log", "Plot y axis on log scale", 
        value = FALSE)

    ),

    mainPanel(plotOutput("plot"))
  )
))

Я получаю:

Ошибка в try.xts (x, error = "chartSeries требуется объект xtsible"): chartSeries требуется объект xtsible

Я попытался преобразовать dataInput в XTS, но XTS и реактивный, похоже, вызывают у меня много проблем с моим ограниченным пониманием того, что происходит.


person Dronny    schedule 26.07.2015    source источник
comment
Спасибо за комментарий! Когда я изменяю dataInput так, чтобы он принимал только один вход $ Symb вместо 2 (и устанавливаю auto-assign на FALSE), приведенный выше код работает нормально. Я не уверен, почему добавление второго символа вызывает столько проблем.   -  person Dronny    schedule 27.07.2015
comment
Я думаю, это потому, что getSymbols() - это просто оболочка, которая напрямую не возвращает объект, поэтому, когда вы пытаетесь назначить его dataInput, нет конкретной вещи для назначения. Вместо этого он создает отдельные фреймы данных с именами вызываемых символов в глобальной среде.   -  person ulfelder    schedule 27.07.2015
comment
Результатом getSymbols() является объект xts. Добавление еще одного тикера для отображения того же графика - нетривиальная задача. Должно быть возможно достичь этого, определив временной ряд одного тикера как индикатор другого, в частности, используя newTA() с опцией on=1, но это несколько сложно.   -  person RHertel    schedule 27.07.2015
comment
Спасибо! Не понимал, что это было нетривиально.   -  person Dronny    schedule 27.07.2015


Ответы (1)


как упоминал @RHertel, это не так-то просто сделать. Но для иллюстрации я немного изменил ваш server.R скрипт, чтобы вы могли увидеть, как он закончится. Я добавил несколько комментариев в сценарий, чтобы вы могли следить за тем, что было изменено.

Во-первых, я разделил два набора данных, потому что после установки auto.assign=TRUE вы больше не можете вызывать dataInput в надежде, что он вернет два набора данных. auto.assign=TRUE автоматически назначает два ваших набора данных отдельно глобальной среде. Так что в этом случае есть другой способ вызвать наборы данных. Чтобы избежать хлопот, разделите два набора данных, чтобы вы могли установить auto.assign=FALSE и вызывать наборы данных из `dataInput.

Затем я сохранил два набора данных в списке, чтобы вы могли вызывать их по отдельности позже в сценарии, в output$plot.

Наконец, я добавил аргумент TA, как объяснил @RHertel выше. Мне пришлось использовать функцию paste, чтобы автоматизировать процесс.

Как видите, результат выглядит некрасиво и все еще нуждается в некоторой очистке. Но я просто хотел дать вам представление о том, как это будет выглядеть. Я не эксперт в финансах, но я почти никогда не хотел бы видеть несколько цен на акции на одном графике, потому что они могут значительно различаться, и вы можете получить странные графики, подобные приведенному ниже. Чтобы стандартизировать шкалу, обычно доходность акций наносится на одну диаграмму, потому что, хотя цены могут быть разными, доходность имеет нижний и верхний предел от 0 до 100%. Так что они попали бы в один масштаб.

library(quantmod)

shinyServer(function(input, output) {



  dataInput <- reactive({   
    data1 <- getSymbols(input$symb1, src = "yahoo",      #Seperated the data into two seperate data sets and set auto.assign=FALSE
               from = input$dates[1],
               to = input$dates[2],
               auto.assign = FALSE)
    data2 <- getSymbols(input$symb2, src = "yahoo",     #Seperated the data into two seperate data sets and set auto.assign=FALSE
                        from = input$dates[1],
                        to = input$dates[2],
                        auto.assign = FALSE)
    return (list(data1,data2))                          #Stored the data sets in a single list 
  })


  output$plot <- renderPlot({
    chartSeries(dataInput()[[1]], TA=paste0("addTA(",input$symb1,",on=1)"),theme = chartTheme("white"),    #added the TA argument with the paste helper function
                type = "line", log.scale = input$log)
    chartSeries(dataInput()[[2]], TA=paste0("addTA(",input$symb2,",on=1)"),theme = chartTheme("white"), 
                type = "line", log.scale = input$log)
  }) 
})
person Bahae Omid    schedule 28.07.2015