在 R Shiny 中显示/隐藏整个盒子元素

Posted

技术标签:

【中文标题】在 R Shiny 中显示/隐藏整个盒子元素【英文标题】:Show/hide entire box element in R Shiny 【发布时间】:2017-12-01 01:59:11 【问题描述】:

我目前正在尝试找到一种方法来隐藏/显示 R Shiny 中的整个 box() 元素(以及其中的所有内容)。我想创建一个按钮,允许用户展开特定框,然后用相同(甚至不同)按钮隐藏它。我不想使用 conditionalPanel,因为我的应用程序非常大并且会产生一些问题。

示例代码如下:

library(shiny)
library(shinydashboard)
library(collapsibleTree)
require(colorspace)
# Dataset is from https://community.tableau.com/docs/DOC-1236
load(system.file("extdata/Superstore_Sales.rda", package = "collapsibleTree"))
# For the sake of speed, let's only plot sales in Ontario
Superstore_Sales <- Superstore_Sales[Superstore_Sales$Region=="Ontario",]

# Define UI for application that draws a collapsible tree
ui <- fluidPage(

  # Application title
  titlePanel("Collapsible Tree Example 3: Gradient Mapping"),

  # Sidebar with a select input for the root node
  sidebarLayout(
    sidebarPanel(

      tags$a(href = "https://community.tableau.com/docs/DOC-1236", "Sample dataset from Tableau")
    ),

    # Show a tree diagram with the selected root node
    mainPanel(
      box(title="Tree Output",width='800px',
        collapsibleTreeOutput("plot", height = "500px")
      ),
      box(title="Input",
        selectInput(
          "hierarchy", "Tree hierarchy",
          choices = c(
            "Customer Segment", "Product Category", "Product Sub-Category",
            "Order Priority", "Product Container"
          ),
          selected = c("Customer Segment","Product Category", "Product Sub-Category"),
          multiple = TRUE
        ),
        selectInput(
          "fill", "Node color",
          choices = c("Order Quantity", "Sales", "Unit Price"),
          selected = "Sales"
        )


      )  
    )
  )
)

# Define server logic required to draw a collapsible tree diagram
server <- function(input, output) 
  output$plot <- renderCollapsibleTree(
    collapsibleTreeSummary(
      Superstore_Sales,
      hierarchy = input$hierarchy,
      root = input$fill,
      attribute = input$fill
    )
  )


# Run the application
shinyApp(ui = ui, server = server)

主要思想是拥有一个属于每个框的按钮(或多个按钮)并仅隐藏/显示该特定框。也许使用 shinyjs 是可能的,但我似乎无法理解它应该如何与我当前的结构一起使用。

【问题讨论】:

是标题为“树输出”和“输入”的两个框。我希望它们显示为隐藏并可以通过按钮展开。 我的意思是,它们来自哪个库? 哦,shinydashboard 是库 - 忘记将它添加到代码中。我现在就编辑它 为什么不在shinydashboard::box 中使用collapsible 参数? 可能是因为需要配合dashboardPagedashboardHeader等使用,没关系 【参考方案1】:

这是一个可以扩展到实际应用程序的最小示例。

它使用shinyjs 来显示/隐藏框。关键是给盒子一个id,然后在show/hide函数中使用那个id

library(shiny)
library(shinydashboard)
library(shinyjs)

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            useShinyjs()    ## IMPORTANT: so hiny knows to use the shinyjs library
        ),
        mainPanel(
            box(id = "myBox", title = "Tree Output", width = '800px',
                    selectInput(inputId = "myInput", label = "my input", choices = c(letters))
                    ),
            actionButton(inputId = "button", label = "show / hide")
        )
    )
)

server <- function(input, output)

    ## observe the button being pressed
    observeEvent(input$button, 
        
        if(input$button %% 2 == 1)
            shinyjs::hide(id = "myBox")
        else
            shinyjs::show(id = "myBox")
        
    )


shinyApp(ui, server)

【讨论】:

非常感谢!刚刚在我的原始应用程序中的一个盒子上实现,效果很好!【参考方案2】:

为什么不在shinyjs 中使用toggle 功能而不是检查它是否可以被2 整除

library(shiny)
library(shinydashboard)
library(shinyjs)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      useShinyjs()
    ),
    mainPanel(
      box(id = "myBox", title = "Tree Output", width = '800px',
          selectInput(inputId = "myInput", label = "my input", choices = c(letters))
      ),
      actionButton(inputId = "button", label = "show / hide")
    )
  )
)

server <- function(input, output)

  ## observe the button being pressed
  observeEvent(input$button, 
    shinyjs::toggle("myBox")
  )


shinyApp(ui, server)

【讨论】:

这只是我还没有养成的编码习惯 @SymbolixAU 给出的答案对于处理输入选择下拉菜单而不是按钮时也很有用。 (供未来的读者使用)。

以上是关于在 R Shiny 中显示/隐藏整个盒子元素的主要内容,如果未能解决你的问题,请参考以下文章

定位

如何使用操作按钮在 R Shiny 中显示和隐藏表格输出?

在 R Shiny 中创建第二个 UI 元素

基于选项卡面板选择在 R Shiny 中显示/隐藏 selectinput

float浮动元素性质

在下拉菜单中响应地隐藏和显示子元素