0

In this shiny App (code below), tabPanel 'Scatter plot', note that the plot is correctly rendered only when the user expand the bsCollapsePanel 'Marker settings' for the first time. Before expanding the panel 'Marker settings' at first time, the message Error: argument is of length zero is shown. Can someone find out where the error is in the code?


library(shiny)
library(shinyBS)
library(tidyverse)

shinyApp(
  ui = fluidPage(
    tabsetPanel(
      tabPanel("mtcars",
               dataTableOutput("mtcarsDATA")),
      
      tabPanel("Scatter plot",
               sidebarPanel(
                 bsCollapse(id = "Side panel", open = "Variables",
                            bsCollapsePanel("Variables",
                                            uiOutput("varx"),
                                            uiOutput("vary"))
                 )
               ),
               
               mainPanel(
                 bsCollapsePanel("Marker settings",
                                 uiOutput("showMrk"),
                                 uiOutput("shpMrk"),
                                 uiOutput("forPorForma"),
                                 uiOutput("forPorVar"),
                                 uiOutput("mrkTrsp")),
                 
                 plotOutput('SctPlot'))
      )
    )
  ),
  
  server <- function(input, output) {
    
    
    
    output$mtcarsDATA <- renderDataTable({
      
      data <- mtcars
      
      getModel <- reactive({
        
        names(data) })
      
      output$varx <- renderUI({
        selectInput("varsel.x", HTML("Select var X<span style='color: red'>*</span>"),
                    choices = as.list(getModel()), multiple = F) })
      
      getModelnum <- reactive({
        
        filterNumeric <- data[sapply(data, is.numeric)]
        names(filterNumeric) })
      
      output$vary <- renderUI({
        selectInput("varsel.y", HTML("Select var Y<span style='color: red'>*</span>(numerical only)"),
                    choices = as.list(getModelnum()), multiple = F) })
      
      output$showMrk <- renderUI({
        checkboxInput("show_Mrk", "Show marker", value=T) })
      
      output$shpMrk <- renderUI({
        conditionalPanel(condition = "input.show_Mrk == T",      
                         radioButtons("shp_Mrk", "Format marker",
                                      choices = c("by shape", "by variable"))) })
      
      output$forPorForma <- renderUI({
        conditionalPanel(condition = "input.shp_Mrk == 'by shape' & input.show_Mrk == T",
                         sliderInput("for_PorForma", 'Deslize para mudar o formato do marcador',
                                     min = 1, max=25, value = 16)) })
      
      output$mrkTrsp <- renderUI({
        conditionalPanel(condition = "input.show_Mrk == T",   
                         sliderInput("mrk_Trsp", 'Slide to change marker transparency',
                                     min = 0, max=1, value = .5, step=.05)) })
      
      getModelcat <- reactive({
        
        filterCaracter <- data[sapply(data, is.character)]
        names(filterCaracter) })
      
      output$forPorVar <- renderUI({
        conditionalPanel(condition = "input.show_Mrk == 1 & input.shp_Mrk == 'by variable'",
                         selectInput("forPorVar.sel", "Select var",
                                     choices = as.list(getModelcat()), multiple = F)) })
      
      
      output$SctPlot <- renderPlot({
        
        if(input$show_Mrk == T){
          if(input$shp_Mrk == "by shape") {
            
            geomPoint <- geom_point(alpha=1-input$mrk_Trsp, shape=input$for_PorForma) } else {
              geomPoint <- geom_point(alpha=1-input$mrk_Trsp, aes_string(shape=(input$forPorVar.sel))) }} else {
                
                geomPoint <- geom_point(alpha=0) }
        
        p <- data %>%
          ggplot(aes_string(x=input$varsel.x, y=input$varsel.y)) +
          geomPoint
        
        p
        
      })
      
      data
      
    })
  }
)

  • You have nested `output` inside `output`, etc. Perhaps if you remove these nested outputs, it might work. – YBS Feb 08 '23 at 17:48
  • Thanks YBS. I've nested because, in my whole code, I use a same renderUI in multiple uiOutputs. I did it in order to reduce the code, with no need of typing multiple times a same output. I will wait for some solution, if it exists. – Hassan Camil David Feb 08 '23 at 18:15

0 Answers0