Оператор $ недопустим для атомных векторов в блестящем, используя dygraph и считывая несколько данных - PullRequest
0 голосов
/ 08 октября 2019

У меня проблемы с неверным атомным вектором, когда я хочу построить график с помощью dygraph в R Shiny. Входные данные могут быть выбраны с помощью SelectInput, и файлы сохраняются в моем каталоге в формате CSV. Это в основном соединение между пользовательским интерфейсом и сервером, которое я пытаюсь заставить его работать.

Я прочитал ответ и знаю, что это ошибка от 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 и т. Д.

Я был бы очень признателен за любую помощь или проблеск, я пробовал так много вещей. Спасибо !!!

1 Ответ

0 голосов
/ 09 октября 2019

Добро пожаловать в 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-файл каждый раз, когда вы хотите обновить сюжет. Было бы лучше прочитать их только тогда, когда они необходимы.

...