Shiny中有条件渲染的UI元素的占位符

时间:2016-01-28 06:52:38

标签: r shiny reactive-programming

在Shiny中渲染UI元素的适当占位符是什么?我希望部分UI基于global.R中确定的条件进行渲染,因此不是renderUI。我认为使用空列表或标签列表可能会起作用,但它似乎无法完成这项工作。

这是一个例子,当init为TRUE时,应该渲染第一个框,当init为FALSE时,只应渲染第二个框。第二部分并没有正常运作。

library(shiny)
library(shinydashboard)

## Globally set
init <- FALSE # sometimes TRUE

ui <- tagList(
    fluidPage(
        tabBox(
            ## What is the appropriate placeholder here?
            if (init) {
                tabPanel(
                    title='Bad box',
                    box(selectInput('id', 'Appear if TRUE', 1:10))
                )
            } else 
                list(),
            tabPanel(
                title='Good box',
                box(selectInput('id1', 'Always Apper', letters))
            )
        )
    )
)

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

shinyApp(ui, server)

2 个答案:

答案 0 :(得分:1)

这样的事情会起作用吗?我创建了一个包含两个框的列表,然后在do.call中对其进行子集,以根据init值添加一个或两个框。

library(shiny)
library(shinydashboard)

## Globally set
init <- FALSE # sometimes TRUE

box_element <- list(
  tabPanel(
  title='Bad box',
  box(selectInput('id', 'Appear if TRUE', 1:10))),

  tabPanel(
    title='Good box',
    box(selectInput('id1', 'Always Apper', letters))
  ))


ui <- tagList(
  fluidPage(
   do.call(tabBox,box_element[(2-init):2])
  )
)

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

shinyApp(ui, server)

答案 1 :(得分:0)

shinyjs具有根据特定条件显示/隐藏元素的功能,并且该条件可以是无效值。当您想在服务器而不是UI中隐藏/显示时,它完全用于此类情况。这是一个简单的例子,只要数字输入中的数字是奇数,它就会显示文本输入。你当然可以将这个条件改为你想要的任何东西。

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  numericInput("num", "Show a text input when the number is odd", 0),
  hidden(textInput("text", "Text"))
)
server <- function(session, input, output) {
  observe({
    toggle(id = "text", condition = (input$num %% 2 == 1))
  })
}

shinyApp(ui, server)