Программирование реактивности нескольких рядов линий различной длины на графиках в одном графике с использованием selectizeInput - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть xts объект данных фондового рынка с индексом, содержащим даты, а остальные столбцы содержат финансовые показатели для каждой акции. Однако не все акции имеют одинаковый диапазон дат. Для тех, у кого более короткая история, их строки заполнены NA для дат, в которые их данные не применимы.

В своем блестящем приложении я пытаюсь предоставить пользователям возможность выбрать 1 или более акций для просмотра. Я использовал selectizeInput. Я столкнулся с двумя проблемами здесь:

1). Я использую весь объект xts в качестве источника данных. Если я выберу только 1 акцию с более короткой историей (с сетевыми индексами), то отображаемый графический элемент также содержит пробелы на графике. Например, StockF ниже не имеет данных до 27 ноября 2007 года, но показывает пустое пространство на графике. Я хочу отображать только диапазон дат, в котором есть данные. Я пытался использовать complete.cases, но он эффективно удаляет другие акции, которые имеют более длинную историю, чем StockF (что мне не нужно)

enter image description here

2). Есть некоторые акции с минимальной историей, и R читает их как логический тип данных из-за большого количества NA. Я заставил его вернуться с as.numeric. Однако это не работает, и результирующий вывод представляет собой зигзагообразную линию в диапазоне от 0 (False) до 1 (True). Любые рекомендации относительно того, как я могу решить эту проблему? Образец моего набора данных, который я буду прикреплять ниже в этом посте, не фиксирует это, поскольку мне нужно вставить весь этот набор данных (что невозможно) в это сообщение.

Пример моих данных:

df <- structure(list(Date = structure(c(1194307200, 1194393600, 1194566400, 
                                    1194825600, 1194912000, 1194998400, 1195084800, 1195171200, 1195430400, 
                                    1195516800, 1195603200, 1195689600, 1195776000, 1196035200, 1196121600, 
                                    1196208000, 1196294400, 1196380800, 1196640000, 1196726400), class = c("POSIXct", 
                                                                                                           "POSIXt"), tzone = "UTC"), 
                 StockA = c(1.7, 1.68, 1.66, 1.64, 1.61, 1.6, 1.57, 1.56, 1.55, 1.55, 1.52, 1.5, 1.51, 1.52, 1.5, 1.5, 1.52, 1.56, 1.56, 1.56), 
                 StockB = c(1.35, 1.35, 1.31, 1.31, 1.28, 1.3, 1.27, 1.25, 1.25, 1.25, 1.22, 1.21, 1.21, 1.25, 1.25, 1.23, 1.24, 1.25, 1.22, 1.23), 
                 StockC = c(1.29, 1.27, 1.26, 1.21, 1.19, 1.22, 1.17, 1.12, 1.15, 1.16, 1.12, 1.12, 1.16, 1.16, 1.16, 1.14, 1.12, 1.12, 1.17, 1.16), 
                 StockD = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
                            NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
                 StockE = c(0.71, 0.7, 0.7, 0.68, 0.7, 0.7, 0.69, 0.68, 0.67, 0.68, 0.65, 0.65, 0.64, 0.65, 0.64, 0.63, 0.64, 0.65, 0.65, 0.66), 
                 StockF = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.89, 0.88, 0.87, 0.87, 0.89, 0.90)), 
            row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))

df <- xts(df[, -1], order.by = as.Date(df$Date))

UI:

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
      box(
        selectizeInput("stocknames", "Select Stocks", choices = colnames(df), 
                   selected = "StockA", multiple = TRUE)
      ),
      box(
        dygraphOutput("dygraph_plot")
      )
    )
  )
)

Сервер:

library(shiny)
library(shinydashboard)
library(readxl)
library(dplyr)
library(dygraphs)
library(xts)

server <- function(input, output) {

  output$dygraph_plot <- renderDygraph({

    dygraph(df[, input$stocknames]) %>%
      dyRangeSelector(height = 30)
  })

}

shinyApp(ui, server)

Спасибо и высоко ценим!

...