javascript - 禁用/启用点击 Shiny 的仪表板侧边栏

标签 javascript r shiny

有没有一种方法可以禁用/启用点击仪表板侧边栏,以防止用户导航到 Shiny 的不同 View ?

我遇到了这个解决方案“disabling/enabling sidebar from server side”,但它所做的只是折叠/取消折叠边栏。

但我正在寻找一些解决方案,通过它我可以启用/禁用点击它,以便更好地控制何时允许访问用户以导航到不同的 View 。

一个用例是:如果我希望用户先填写第一页上的所有输入,然后他/她才能导航到不同的部分。

最佳答案

您可以使用 shinyjs 包和一些自定义 css 来完成此操作。这是一个最小的例子:

library(shinydashboard)
library(shinyjs)

ui <- dashboardPage(
  dashboardHeader(title = "Basic dashboard"),
  dashboardSidebar(
    useShinyjs(),
    sidebarMenu(id = "sidebar",
      tags$head(tags$style(".inactiveLink {
                            pointer-events: none;
                           cursor: default;
                           }")),
     menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
     menuItem("Widgets", tabName = "widgets", icon = icon("th"))
    )
    
  ),
  dashboardBody(
    tabItems(
      # First tab content
      tabItem(tabName = "dashboard",
              actionButton("Disable", "Disable Widgets"),
              actionButton("Enable", "Enable Widgets")
      ),
      
      # Second tab content
      tabItem(tabName = "widgets",
              h2("Widgets tab content")
      )
    )
    )
  )



server <- function(input, output){
  
  
  observeEvent(input$Disable, {
     addCssClass(selector = "a[data-value='widgets']", class = "inactiveLink")
    
  })
  observeEvent(input$Enable, {
    removeCssClass(selector = "a[data-value='widgets']", class = "inactiveLink")
  })
  
}
shinyApp(ui, server)

通过点击按钮“Enable(Enable Widgets)”和“Disable(Disable Widgets)”,您可以启用和禁用 menuitem widgets。

编辑:

要确保在应用程序加载时禁用 menuItems,您只需在服务器中添加 addCssClass 函数,以便在您的应用程序加载时执行它。

所以代码看起来像这样:

library(shinydashboard)
library(shinyjs)

ui <- dashboardPage(
  dashboardHeader(title = "Basic dashboard"),
  dashboardSidebar(
    useShinyjs(),
    sidebarMenu(id = "sidebar",
      tags$head(tags$style(".inactiveLink {
                            pointer-events: none;
                           cursor: default;
                           }")),
     menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
     menuItem("Widgets", tabName = "widgets", icon = icon("th"))
    )
    
  ),
  dashboardBody(
    tabItems(
      # First tab content
      tabItem(tabName = "dashboard",
              actionButton("Disable", "Disable Widgets"),
              actionButton("Enable", "Enable Widgets")
      ),
      
      # Second tab content
      tabItem(tabName = "widgets",
              h2("Widgets tab content")
      )
    )
    )
  )



server <- function(input, output){
  
  #Disable menuitem when the app loads
  addCssClass(selector = "a[data-value='widgets']", class = "inactiveLink")
  
  observeEvent(input$Disable, {
     addCssClass(selector = "a[data-value='widgets']", class = "inactiveLink")
    
  })
  observeEvent(input$Enable, {
    removeCssClass(selector = "a[data-value='widgets']", class = "inactiveLink")
  })
  
}
shinyApp(ui, server)

关于javascript - 禁用/启用点击 Shiny 的仪表板侧边栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48278111/

相关文章:

javascript - .next() 在 .each() 循环中不起作用

javascript - document.open()语句自动滚动页面

javascript - 调用阴影原型(prototype)方法的更简单/更好的方法?

r - 为什么更改起始值时R中的“optimx”会给出不同的结果?

r - ggplot2:并排的条形图,一个条堆叠,另一个没有

Shiny:如何在 react 例程之外使用来自 URL 的 session 信息

javascript - 可以使用带有 int 参数的 jQuery outerHeight 函数吗?

r - 防止单列自动转换为向量

javascript - 使用D3和Shiny在R中实现 `identify()`

r - 如何在 Shiny 的应用程序中使用多个过滤器有效处理数据