1

I have a dataframe that has these columns:

document, user, month, views

I am using a selectInput to filter the data by document. I want to plot a (Plotly) line chart of views per month, for each user, for the selected document.

E.g. If one filters to a document for which ten users exist, I want to display ten plots, each showing the relevant user's views per month.

At current:
- I filter the data to the selected document (dplyr).
- I pass the filtered data to a function.
- In the function, I loop through the current document's users.
- In each loop, I filter the data to the current user (dplyr), and append a Plotly output to a output list.
- At the end of the function, I return the output list.
- The result of the function is assigne to a UI output.

The app successfully runs, but where the plots should display, I get a Result must have length x, not y error.

How would you go about this? I appreciate any advice you can give me. For security reasons I cannot share my existing code, sorry - I understand that it's not very useful.


Edit: I've created a minimal reproducible example, based on this.
The process has changed slightly from my original question, mainly that I'm not using a separate function.

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)
  • You need a reactive variable inside the server-part of your shiny. This variable 'watches' input from your selectInput, and uses that (by exampl: for filtering). – Wimpel Jul 13 '18 at 08:21
  • 1
    If you can't share your code, you can make a [minimal reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), In doing so, you might work out your own issue and it allows us to work through any errors. – Michael Bird Jul 13 '18 at 14:24
  • @MichaelBird I have updated my question – MiffyXilacon Jul 17 '18 at 15:28

0 Answers0