简体   繁体   中英

How to change elements of 'navbarPage' and 'tabPanel' components after loading R Shiny reactive system?

I am researching how to change elements 'navbarPage' and 'tabPanel' components after loading R Shiny reactive system. Here is a code

library(shiny)

# How to change these elements after loading R Shiny reactive system
str_title <- "Title"
str_window_title <- "Window title"
str_cars <- "Cars"
str_iris <- "Iris"

# UI
ui <- fluidPage(
  navbarPage(
    title = str_title, 
    windowTitle = str_window_title,
    tabPanel(title = str_cars, fluidPage(fluidRow(dataTableOutput("dt_mtcars")))),
    tabPanel(title = str_iris, fluidPage(fluidRow(dataTableOutput("dt_iris"))))
  ))

# SERVER
server <- function(input, output) {
  output$dt_mtcars <- renderDataTable(datatable(mtcars))
  output$dt_iris <- renderDataTable(datatable(iris))
}

# RUN APP
shinyApp(ui = ui, server = server)

The question is how to change values of 'title', 'window_title' for 'navbarPage' component, and 'title' for 'tabPanel' component AFTER loading the Shiny app. For example, add to these names the prefix 'New ' and have the values 'New Title', 'New Window title', 'New Cars', 'New Iris'.

Thanks for sharing your ideas!

I couldn't find a solution for windowTitle , but for the 3 others elements you can use a textOutput and reactive values to make the elements change. Here is an example of changing the elements names after clicking on an action button.

EDIT: found a way to change windowTitle too, based on this answer

library(shiny)
library(DT)

# UI
ui <- fluidPage(
  actionButton("btn", "Change components' names"),
  #javascript code to change window title
  tags$script(HTML('Shiny.addCustomMessageHandler("changetitle", function(x) {document.title=x});')),
  navbarPage(
    title = textOutput("str_title"), 
    windowTitle = "Window title",
    tabPanel(title = textOutput("str_cars"), fluidPage(fluidRow(dataTableOutput("dt_mtcars")))),
    tabPanel(title = textOutput("str_iris"), fluidPage(fluidRow(dataTableOutput("dt_iris"))))
  ))

# SERVER
server <- function(input, output, session) {
  # initialize names
  rv <- reactiveValues(str_title = "Title",
                       str_window_title = "Window title",
                       str_cars ="Cars",
                       str_iris = "Iris")
  
  output$dt_mtcars <- renderDataTable(datatable(mtcars))
  output$dt_iris <- renderDataTable(datatable(iris))
  
  output$str_title <- renderText({
    rv$str_title
  })
  output$str_window_title <- renderText({
    rv$str_window_title
  })
  output$str_cars <- renderText({
    rv$str_cars
  })
  output$str_iris <- renderText({
    rv$str_iris
  })
  
  #change names when button is clicked
  observeEvent(input$btn,{
    print("Change names")
    rv$str_title <- paste0(rv$str_title,"+")
    rv$str_window_title <- paste0(rv$str_window_title,"+")
    rv$str_cars <- paste0(rv$str_cars,"+")
    rv$str_iris <- paste0(rv$str_iris,"+")
    
    session$sendCustomMessage("changetitle", rv$str_window_title )
  })
  

}

# RUN APP
shinyApp(ui = ui, server = server)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM