Блестящая ошибка «сравнение (5) возможно только для атомарных и списочных типов» при фильтрации реактивной переменной по дате - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь использовать dateRangeInput для фильтрации и обобщения некоторых данных. Я получаю следующую ошибку:

Warning: Error in >=.default: comparison (5) is possible only for atomic and list types

Мой код:

library(shiny)
library(shinydashboard)
library(tidyverse)


dat <- reactiveFileReader(
  intervalMillis = 100000,  
  NULL,
  filePath = 'appData/data.csv',
  readFunc = read.csv,
  header = TRUE
)

header <- dashboardHeader(title = "figures")
sidebar <- dashboardSidebar(uiOutput('sidebar'))
body <- dashboardBody(shinyjs::useShinyjs(),uiOutput("body"))

fluidRow1 <- fluidRow(
  infoBoxOutput("calls")
)

ui <- dashboardPage(title = 'figures', header, sidebar, body, skin='blue')

server <- function(input, output, session){

  overall <- reactive({
    dat() %>%
      filter(date >= input$dates[1]) %>%
      filter(date <= input$dates[2]) %>%
      select(-date) %>%
      summarise_all(.funs = sum, na.rm = TRUE)
  })


output$body <- renderUI({
  tabItems(
    tabItem(tabName = 'overall', class = 'active', h2(fluidRow1))
  )})

output$sidebar <- renderUI({
  sidebarMenu(
    menuItem("Overall", tabName = "overall", icon = icon("adjust"),
             menuSubItem(icon = NULL,
                         dateRangeInput(inputId = 'dates', 
                                        label = 'Range:', 
                                        start = '2019-10-03', 
                                        end = '2019-10-10'
                         ))
             ))
})

output$calls <- renderInfoBox({
  infoBox(
    "Total Calls", overall()[1,1], icon = icon("list"),
    color = "purple"
  )
})
}
shinyApp(ui = ui, server = server)

Мои данные выглядят так:

         date recordsCreated optionsCreated
1  2019-03-08             NA             NA
2  2019-03-08             NA             NA
3  2019-03-08             NA              1
4  2019-03-08             NA             NA
5  2019-03-08             NA             NA
6  2019-03-08              5              2
7  2019-03-08              8              6
8  2019-03-08             NA             NA
9  2019-03-08              4              3
10 2019-03-08             NA             NA

Таким образом, похоже, что столбец даты на самом деле является фактором, поэтому я попытался изменить его на фактическую дату, изменив фильтр на

overall <- reactive({
    dat() %>%
      filter(as.Date(date) >= input$dates[1]) %>%
      filter(as.Date(date) <= input$dates[2]) %>%
      select(-date) %>%
      summarise_all(.funs = sum, na.rm = TRUE)
  })

, что дает ошибку

Warning: Error in as.Date.default: do not know how to convert 'x' to class “Date”

Может кто-нибудь помочь с этим, пожалуйста?

1 Ответ

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

Я думаю, что проблема с as.Date в том, что вы не указываете формат. Попробуйте это:

as.Date(date, format = "%Y-%m-%d")

Но я думаю, что было бы лучше отформатировать даты в reactiveFileReader, установив параметр colClasses функции read.csv. Используя setAs, вы можете создать метод для этого конкретного формата даты:

setAs("character","myDate", function(from) as.Date(from, format="%Y-%m-%d") )

dat <- reactiveFileReader(
  intervalMillis = 100000,  
  NULL,
  filePath = 'appData/data.csv',
  readFunc = read.csv,
  colClasses=c('myDate','numeric','numeric'),
  header = TRUE
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...