#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)
Также я бы настоятельно рекомендовал поделиться кодом вашего минимального примера, включая некоторые фиктивные данные, чтобы его можно было скопировать и вставить в одно мгновение. Это увеличило бы шансы на то, что кто-нибудь ответит.