1

我正在研究如何在加载 R Shiny 反应系统后更改元素“navbarPage”和“tabPanel”组件。这是一个代码

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)

问题是如何在加载 Shiny 应用程序后更改 'navbarPage' 组件的 'title'、'window_title' 和 'tabPanel' 组件的 'title' 的值。例如,为这些名称添加前缀“New”,并具有值“New Title”、“New Window title”、“New Cars”、“New Iris”。

感谢您分享您的想法!

4

1 回答 1

2

我找不到解决方案windowTitle,但是对于其他 3 个元素,您可以使用 atextOutput和反应值来使元素发生变化。这是单击操作按钮后更改元素名称的示例。

编辑:也找到了改变 windowTitle 的方法,基于这个答案

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)
于 2020-12-20T10:41:55.483 回答