首页 > 解决方案 > $ 运算符对于使用 dygraph 和读取多个数据的闪亮原子向量无效

问题描述

当我想在 R Shiny 中使用 dygraph 绘制图形时,我遇到了无效原子向量的问题。输入可以通过 SelectInput 选择,文件以 CSV 格式保存在我的目录中。这基本上是我试图使其工作的 UI 和服务器之间的连接。

我已经阅读了答案,我知道这是 R 的一个错误,它没有很好地标记,这就是为什么我还没有弄清楚如何解决它。

ui <- dashboardPage(
  fluidPage(

      fluidRow(
          column(3,
               "sidebar",

               fluidPage(
                 wellPanel(height =500),
                 box(selectInput("period", "Choose Year:",
                                     c("2006" = "2006", 
                                       "2007" = "2007",
                                       "2008" = "2008",
                                       "2009" = "2009"
                                       )),
                     width=NULL),

                wellPanel(height =300)
                 )
          ),

        column (9,
               "main",
           fluidPage(
                wellPanel(width = "100%", height = "100%",
                  dygraphOutput("PerYear")
                 )
               )
          )
      )


server <- function(input, output, session) {
 output$PerYear <- renderDygraph({

reading_csv <- function (year) {

    csvpath <- "./xts_folder/"

     y <-read.csv(paste0(csvpath,year,"_RW.csv"),header=TRUE, sep=",")
     ytime <- mdy_hm(y[["timestampUTC"]], tz="UTC")
     y_xts <- xts(y, order.by = ytime)
     ts.sn.year<-dygraph(y_xts)%>% dyRangeSelector()
      return(ts.sn.year)
   }

  if(input$period == "2006" ){
     y<-2006
     pyear<-reading_csv(year = y) 
     pyear
    }

  else if(input$period == "2007" ){
    y<-2007
    pyear<-reading_csv( year = y) 
    pyear
  }

  else if(input$period == "2008" ){
    y<-2008
    pyear<-reading_csv(year=y) 
    pyear

  }
   else if(input$period == "2009" ){
     y<-2009
     pyear<-reading_csv(year=y) 
     pyear
   }   

  }
  )
}

也许有一些错误,因为我删除了其余的代码,但主要部分是 dygraph 的渲染和输出的连接。CSV 文件可能如下所示:

timestampUTC,max
1/1/2006 0:50,0.7
1/1/2006 1:50,6.4
1/1/2006 2:50,7.5
1/1/2006 3:50,0.3
1/1/2006 4:50,0
1/1/2006 5:50,0.2
1/1/2006 6:50,0.7
1/1/2006 7:50,1.5
1/1/2006 8:50,0.5
1/1/2006 9:50,0.4
1/1/2006 10:50,0.3
1/1/2006 11:50,1.6
1/1/2006 12:50,0.7
1/1/2006 13:50,1.6
1/1/2006 14:50,0.6
1/1/2006 15:50,0.2
1/1/2006 16:50,0.4
1/1/2006 17:50,0.7

例如,从代码中可以看出,它们以相同的名称格式存储:2006_RW、2007_RW 等。

我真的很感激任何帮助或一瞥,我已经尝试了很多东西。谢谢!!!

标签: rshinyatomic

解决方案


欢迎来到 SO!

我清理了你的用户界面。

请检查以下内容:

# Create files ------------------------------------------------------------

csvpath <- "./xts_folder/"

if(!dir.exists(csvpath)){
  dir.create(csvpath)
}

DF <- data.frame(stringsAsFactors=FALSE,
                 timestampUTC = c("1/1/2006 0:50", "1/1/2006 1:50", "1/1/2006 2:50",
                                  "1/1/2006 3:50", "1/1/2006 4:50", "1/1/2006 5:50",
                                  "1/1/2006 6:50", "1/1/2006 7:50", "1/1/2006 8:50", "1/1/2006 9:50",
                                  "1/1/2006 10:50", "1/1/2006 11:50", "1/1/2006 12:50",
                                  "1/1/2006 13:50", "1/1/2006 14:50", "1/1/2006 15:50",
                                  "1/1/2006 16:50", "1/1/2006 17:50"),
                 max = c(0.7, 6.4, 7.5, 0.3, 0, 0.2, 0.7, 1.5, 0.5, 0.4, 0.3, 1.6,
                         0.7, 1.6, 0.6, 0.2, 0.4, 0.7)
)
DF
write.csv(DF, file = file.path(csvpath, "/2006_RW.csv"), row.names = FALSE, quote = FALSE)

DF$timestampUTC <- gsub("2006", "2007", DF$timestampUTC)
DF$max <- runif(18)
write.csv(DF, file = file.path(csvpath, "/2007_RW.csv"), row.names = FALSE, quote = FALSE)

DF$timestampUTC <- gsub("2007", "2008", DF$timestampUTC)
DF$max <- runif(18)
write.csv(DF, file = file.path(csvpath, "/2008_RW.csv"), row.names = FALSE, quote = FALSE)

DF$timestampUTC <- gsub("2008", "2009", DF$timestampUTC)
DF$max <- runif(18)
write.csv(DF, file = file.path(csvpath, "/2009_RW.csv"), row.names = FALSE, quote = FALSE)


# App ---------------------------------------------------------------------

library(shiny)
library(shinydashboard)
library(dygraphs)
library(lubridate)
library(xts)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(selectInput(
      "period",
      "Choose Year:",
      c(
        "2006" = "2006",
        "2007" = "2007",
        "2008" = "2008",
        "2009" = "2009"
      )
    )
  ),
  dashboardBody(
    wellPanel(
      width = "100%",
      height = "100%",
      dygraphOutput("PerYear")
    )
  )
)

server <- function(input, output, session) {
  output$PerYear <- renderDygraph({
    reading_csv <- function (year) {
      csvpath <- "./xts_folder/"

      y <- read.csv(paste0(csvpath, year, "_RW.csv"), header = TRUE, sep = ",")
      ytime <- mdy_hm(y[["timestampUTC"]], tz = "UTC")
      y_xts <- xts(y, order.by = ytime)
      ts.sn.year <- dygraph(y_xts) %>% dyRangeSelector()
      return(ts.sn.year)
    }

    if (input$period == "2006") {
      y <- 2006
      pyear <- reading_csv(year = y)
      pyear
    }

    else if (input$period == "2007") {
      y <- 2007
      pyear <- reading_csv(year = y)
      pyear
    }

    else if (input$period == "2008") {
      y <- 2008
      pyear <- reading_csv(year = y)
      pyear

    }
    else if (input$period == "2009") {
      y <- 2009
      pyear <- reading_csv(year = y)
      pyear
    }
  })
}

shinyApp(ui, server)

但是,我建议您每次要更新绘图时都阅读 csv 文件。最好只在需要时阅读它们。


推荐阅读