cepheus
cepheus

Reputation: 5

R fails render on Shiny DashBoard after editing tabitems

library(shiny)
library(tidyverse)
library(leaflet)
library(shinydashboard)
library(RColorBrewer)
library(viridis)
library(shinyWidgets)


ui <- dashboardPage(
    dashboardHeader(title = "Basic dashboard"),
    dashboardSidebar(
        sidebarMenu(
            menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")

                ),
            menuItem("Widgets", tabName = "widgets", icon = icon("th"))
        )
    ),
    dashboardBody(
        # Boxes need to be put in a row (or column)
        tabItems(
            # First tab content
            tabItem(tabName = "dashboard",
                    fluidRow(
                        box(plotOutput("plot1", height = 250)),
                        box(
                            title = "Controls",
                            sliderInput("slider", "Number of observations:", 1, 100, 50)
                        )
                    )
            ),
            # Second tab content
            tabItem(tabName = "widgets",
                    h2("Widgets tab content")
            )
        )
    )
)
server <- function(input, output) {
    set.seed(122)
    histdata <- rnorm(500)
    output$plot1 <- renderPlot({
        data <- histdata[seq_len(input$slider)]
        hist(data)
    })
}
shinyApp(ui, server)

The above example, the output renders when the tabs dashboard and widgets are clicked seperately. In the dashboard tab, i have my slider input in the body. Now when I change my slider to have it at the sidebar:

library(shiny)
library(tidyverse)
library(leaflet)
library(shinydashboard)
library(RColorBrewer)
library(viridis)
library(shinyWidgets)

ui = dashboardPage(
    dashboardHeader(title =  "Dashboard"),
    dashboardSidebar(
        sidebarMenu(
            id = "sidebarmenu",
            menuItem("menuItem1", 
                     tabName = "tab1",
                     sliderInput("slider", "Number of observations:", 1, 100, 50)
            )
            ,
            menuItem("menuItem2", tabName = "tab2")
        )
    ),
    dashboardBody(
        tabItems(
            tabItem(tabName = "tab1",
                    tableOutput("myTable"),
            ),
            tabItem(tabName = "tab2",
                    h2("Placeholder Cloud"),
                    plotOutput("myPlot"))
        )
    )
)

server <- function(input, output, session) {

    tableData = reactiveVal(data.frame(x = 1:10, y = LETTERS[1:10]))
    plotData = reactiveVal()

    observeEvent(input$sidebarmenu, {

        if(input$sidebarmenu == "tab2"){
            #Code for tab 2
            req(is.null(plotData()))
            print("Tab 2 code is run")
            plotData(runif(100))

        }

    })

    output$myTable = renderTable({
        tableData()
    })

    set.seed(122)
    histdata <- rnorm(500)
    output$myPlot = renderPlot({
        data <- histdata[seq_len(input$slider)]
        hist(data)
    })
}

shinyApp(ui, server)

Problem here: 1) The text placeholder cloud, initially only rendered when the tab menuItem2 is clicked, now gets rendered together with the histogram which was supposed to render only when i clicked menuItem1

2) clicking on menuItem2 does not do anything. I would like to have tab2 when clicked, show a scatterplot as seen in this below block of code.

i.e., i would like to "integrate the below 3rd block of code" into the 2nd, the above so when i run the second block of code, when i click tab1, the input for the slider appears and renders the histogram. when i click tab2, the scatterplot will be rendered

library(shiny)
library(tidyverse)
library(leaflet)
library(shinydashboard)
library(RColorBrewer)
library(viridis)
library(shinyWidgets)

ui = dashboardPage(
    dashboardHeader(title =  "Dashboard"),
    dashboardSidebar(
        sidebarMenu(
            id = "sidebarmenu",
            menuItem("menuItem1", 
                     tabName = "tab1")
                ,
            menuItem("menuItem2", tabName = "tab2")
        )
    ),
    dashboardBody(
        tabItems(
            tabItem(tabName = "tab1",
                    tableOutput("myTable")),
            tabItem(tabName = "tab2",
                    h2("Placeholder Cloud"),
                    plotOutput("myPlot"))
        )
    )
)

server <- function(input, output, session) {

    tableData = reactiveVal(data.frame(x = 1:10, y = LETTERS[1:10]))
    plotData = reactiveVal()

    observeEvent(input$sidebarmenu, {

        if(input$sidebarmenu == "tab2"){
            #Code for tab 2
            req(is.null(plotData()))
            print("Tab 2 code is run")
            plotData(runif(100))

        }

    })

    output$myTable = renderTable({
        tableData()
    })

    output$myPlot = renderPlot({
        plot(plotData())
    })
}

shinyApp(ui, server)

Any help is appreciated.I am new to Shiny.

Upvotes: 0

Views: 43

Answers (1)

Daniel_j_iii
Daniel_j_iii

Reputation: 3252

for your 2nd part you said "clicking on menuItem2 does not do anything."... but you don't have any action for menuItem2 see

menuItem("menuItem2", tabName = "tab2")

Upvotes: 0

Related Questions