У меня некоторая проблема с реактивной таблицей в Shiny R

#r #shiny

#r #блестящий

Вопрос:

Я пытаюсь создать панель мониторинга, используя shiny в R, но я сталкиваюсь с некоторыми небольшими проблемами

У меня есть:

db является ли мой data.frame с:

 db$domain:chr, 
db$date:chr,
db$value:num.
  

Итак, я создал:

 db_4 <- reactive({ subset(db,db$domain %in% input$domain amp;
db$date<=input$daterange[2] amp; db$date>=input$daterange[1]})
  

входные данные являются:

 input$domain: selectinput with multiple choices,
input$date: daterangeinput.
  

Я пытаюсь создать таблицу, которая дает мне сумму значений db $, агрегированную по db $ date. Я пробовал что-то вроде:

 output$table2 <- rendertable ({aggregate(db_4()["value"], by=list(db_4()["date"]), sum) })
  

но я всегда получаю пустую таблицу.

Кто-нибудь может мне помочь в решении этой небольшой проблемы?

Спасибо большое

Ответ №1:

Я бы настоятельно рекомендовал вам прочитать эту статью об отладке.

В Shiny вы можете использовать browser() функцию как в reactive , так и в render функциях. Это должно помочь вам найти проблему (т. Е. данные имеют ожидаемую структуру)

Похоже, проблема в aggregate функции: db_4()["date"] возвращает data.frame , где вам нужен вектор.

Решение:

 library(shiny)

db <- data.frame(
  domain = letters[1:3],
  date = seq(
    from = as.Date("2019-01-01"),
    to = as.Date("2019-06-01"),
    by = "1 months"
  ),
  value = runif(12)
)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("domain", "Domain", choices = unique(db$domain)),
      dateRangeInput("daterange", "Date", 
                     min = min(db$date), max = max(db$date),
                     start = min(db$date), end = max(db$date))  
    ),
    mainPanel(
      tableOutput("table2")      
    )
  )
)

server <- function(input, output, session) {
  db_4 <- reactive( { 
    subset(db, 
      db$domain %in% input$domain amp;
      db$date<=input$daterange[2] amp; 
      db$date>=input$daterange[1]
    )
  })

  output$table2 <- renderTable( {
    req(db_4()) # Don't render table when db_4() is NULL

    # Uncomment next line to check if everything goes as expected
    #browser()
    aggregate(
      data.frame(value = db_4()$value), 
      by=list(date = as.factor(db_4()$date)), 
      sum
    )
  })
}

shinyApp(ui, server)
  

Также я бы настоятельно рекомендовал поделиться кодом вашего минимального примера, включая некоторые фиктивные данные, чтобы его можно было скопировать и вставить в одно мгновение. Это увеличило бы шансы на то, что кто-нибудь ответит.