我在Shiny R

时间:2019-03-20 14:21:35

标签: r shiny

我正在尝试在R中使用Shiny创建仪表板,但是我遇到了一些小问题

我有:

db是我的data.frame,拥有:

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

所以我创建了:

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

输入为:

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

我正在尝试创建一个表,该表为我提供db $ date汇总的db $ value的总和。我尝试过类似的事情:

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

但是我总是得到一个空表。

有人可以帮助我解决这个小问题吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

我强烈建议您阅读this article有关调试的信息。

在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 &
      db$date<=input$daterange[2] & 
      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)

我也强烈建议您共享您的最小示例代码,其中包括一些虚拟数据,以便可以立即将其复制粘贴。这样会增加有人回答的机会。