JmO
JmO

Reputation: 572

prevent error in shiny app render plot

Hallo I have a problem inside my shiny app. The app works fine but in the beginning there is the error:

Warning: Error in xy.coords: 'x' and 'y' lengths differ
Stack trace (innermost first):
    102: xy.coords
    101: plot.default
    100: plot
     99: renderPlot [C:/Users/Stuhlian/Desktop/ghj.R#29]
     89: <reactive:plotObj>
     78: plotObj
     77: origRenderFunc
     76: output$plot1
      1: runApp

I made an example code which reproduces the error without the other stuff of the app for simplicity:

ui <- fluidPage(
    mainPanel(uiOutput("samplematches"),
               plotOutput("plot1")

      )
    )

server <- function(input, output) {
re1<-data.frame(x=c(1:10),y=c(1:10))
re2 <-data.frame(x=c(1:10),y=c(1:10))
re3<-data.frame(x=c(1:10),no.matches.Sample1=c(1:10),Sample2=c(11,9,8,4,5,4,3,2,6,2))
result <- reactive({list(re,re2,re3)})


output$samplematches <- renderUI({if(length(grep("Sample", colnames(result()[[3]])))>0){sliderInput("samplematches", "Select Sample for matched masses",min=1, max=length(grep("Sample", colnames(result()[[3]]))), value=1,step=1)} else{return()}})
output$plot1 <- renderPlot({plot(result()[[3]][,1], result()[[3]][,grep("Sample", colnames(result()[[3]]))[input$samplematches]]) })

}

shinyApp(ui, server)

Does anybody know how to prevent this error or if not to hide the output of this special error? Many thanks!

Upvotes: 2

Views: 2406

Answers (1)

mlegge
mlegge

Reputation: 6913

Use shiny::validate to delay the evaluation of the plot until the renderUI has finished and passed a value back to the server:

ui <- fluidPage(
  mainPanel(uiOutput("samplematches"),
            plotOutput("plot1")

  )
)

server <- function(input, output) {
  re1<-data.frame(x=c(1:10),y=c(1:10))
  re2 <-data.frame(x=c(1:10),y=c(1:10))
  re3<-data.frame(x=c(1:10),no.matches.Sample1=c(1:10),Sample2=c(11,9,8,4,5,4,3,2,6,2))
  result <- reactive({list(re1,re2,re3)})


  output$samplematches <- renderUI({
    shiny::validate(
      need(length(grep("Sample", colnames(result()[[3]])))>0, "A message!")
    )
      sliderInput("samplematches", "Select Sample for matched masses",min=1, max=length(grep("Sample", colnames(result()[[3]]))), value=1,step=1)
    })

   output$plot1 <- renderPlot({
     shiny::validate(
       need(input$samplematches, "Input a value!")
     )
     plot(result()[[3]][,1], result()[[3]][,grep("Sample", colnames(result()[[3]]))[input$samplematches]]) 
  })

}

shinyApp(ui, server)

Upvotes: 4

Related Questions