在R Shiny App中过滤反应数据

时间:2018-07-13 08:19:05

标签: r shiny rstudio dashboard reactive

我有一个包含以下列的数据框:

document, user, month, views

我正在使用selectInput来按文档过滤数据。 我想为每个用户绘制所选文档每月的(Plotly)折线图。

例如如果一个过滤器过滤了一个有10个用户的文档,我想显示10个图,每个图显示每月相关用户的视图。

当前:
-我将数据过滤到选定的文档(dplyr)。
-我将过滤后的数据传递给函数。
-在函数中,我循环浏览当前文档的用户。
-在每个循环中,我都将数据过滤到当前用户(dplyr),并将Plotly输出附加到输出列表。
-在函数末尾,我返回输出列表。
-函数的结果分配给UI输出。

该应用程序成功运行,但是在显示图的地方,出现Result must have length x, not y错误。

您将如何处理?我感谢您可以给我的任何建议。 出于安全原因,我无法共享我现有的代码,对不起-我了解它不是很有用。


编辑:我基于this创建了一个可重现的示例。
与最初的问题相比,该过程略有变化,主要是因为我没有使用单独的函数。

library(plotly)
library(tidyverse)

# DATA
data <- data.frame(
  document= c("doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc1","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2","doc2"),
  user= c("user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user3","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user1","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user2","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4","user4"),
  month=  as.Date(c("2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01","2017-07-01","2017-08-01","2017-09-01","2017-10-01","2017-11-01","2017-12-01","2018-01-01","2018-02-01","2018-03-01","2018-04-01","2018-05-01","2018-06-01","2018-07-01","2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01","2017-07-01","2017-08-01","2017-09-01","2017-10-01","2017-11-01","2017-12-01","2018-01-01","2018-02-01","2018-03-01","2018-04-01","2018-05-01","2018-06-01","2018-07-01","2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01","2017-07-01","2017-08-01","2017-09-01","2017-10-01","2017-11-01","2017-12-01","2018-01-01","2018-02-01","2018-03-01","2018-04-01","2018-05-01","2018-06-01","2018-07-01","2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01","2017-07-01","2017-08-01","2017-09-01","2017-10-01","2017-11-01","2017-12-01","2018-01-01","2018-02-01","2018-03-01","2018-04-01","2018-05-01","2018-06-01","2018-07-01","2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01","2017-07-01","2017-08-01","2017-09-01","2017-10-01","2017-11-01","2017-12-01","2018-01-01","2018-02-01","2018-03-01","2018-04-01","2018-05-01","2018-06-01","2018-07-01","2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01","2017-07-01","2017-08-01","2017-09-01","2017-10-01","2017-11-01","2017-12-01","2018-01-01","2018-02-01","2018-03-01","2018-04-01","2018-05-01","2018-06-01","2018-07-01")),
  views= c(19,39,34,3,25,5,1,16,37,21,46,34,23,0,8,10,46,3,47,16,32,4,44,42,12,8,27,39,28,30,26,45,49,38,32,32,1,16,23,34,41,46,37,0,23,44,10,3,43,43,22,38,1,33,11,15,8,21,37,17,7,29,1,33,47,45,37,20,9,41,37,18,30,46,24,45,48,42,49,3,10,17,46,6,12,29,13,6,4,44,37,26,43,5,19,28,44,20,35,40,32,20,41,46,25,47,35,3,25,25,41,5,26,32)
)

# SERVER
server <- shinyServer(function(input, output) {

  output$plots <- renderUI({
    doc_data <- filter(data, document == input$select_doc) # This is the breaking line
    plot_output_list <- lapply(1:length(unique(doc_data$user)), function(i) {
      plotname <- paste("plot", i, sep="")
      plotlyOutput(plotname)
    })

    do.call(tagList, plot_output_list)
  })

  for (i in 1:length(unique(doc_data$user))) {
    local({
      local_i <- i
      doc_users <- unique(doc_data$user)
      plotname <- paste("plot", local_i, sep="")

      plot_data <- filter(doc_data, user == doc_users[local_i]) %>%
        arrange(month)

      output[[plotname]] <- renderPlotly({
        p <- plot_ly(x= plot_data$month, y= plot_data$views, type = 'scatter', mode = 'lines')
        p$elementId <- NULL
        p
      })
    })
  }
})

# UI
ui <- shinyUI(pageWithSidebar(
  headerPanel("Minimum reproducible example"),
  sidebarPanel(
    selectInput("select_doc", choices= unique(data$document), label="", selected= 'doc1')#,
  ),
  mainPanel(
    uiOutput("plots")
  )
))

# RUN 
shinyApp(ui, server)

0 个答案:

没有答案