使用selectizeInput在单个图中的线图中的不同长度的多个线系列的编程反应性

时间:2019-04-22 11:47:37

标签: r shiny xts shinydashboard r-dygraphs

我有一个股票市场数据的xts对象,其索引包含日期,而其他各列则分别包含每种股票的财务指标。但是,并非所有股票都具有相同的日期范围。对于历史较短的用户,其行中填充了不适用其数据的日期的NA。

在我闪亮的应用程序中,我试图为用户提供选择1支或多支股票进行查看的功能。我使用了selectizeInput。我在这里遇到了两个问题:

1)。我正在使用整个xts对象作为数据源。如果我选择具有较短历史记录(具有NA)的仅一只股票,则渲染的笔形图也将包括图中的空白。例如,下面的StockF在2007年11月27日之前没有数据,但是显示了图中的空白区域。我只想显示它有数据的日期范围。我尝试使用complete.cases,但是它可以有效地删除历史比StockF长的其他股票(我不想要)

enter image description here

2)。有些股票的历史记录最少,由于大量的NA,R将其作为逻辑数据类型读取。我已用as.numeric强制将其退回。但是,这不起作用,并且结果输出是从0(假)到1(真)的锯齿形线。关于如何解决此问题的任何建议?在这篇文章中我将在下面附加的数据集示例并未捕获到这一点,因为我需要将我的整个数据集(这是不可能的)插入到这篇文章中。

我的数据示例:

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)

非常感谢!

0 个答案:

没有答案