反应性无线电按钮取决于其他radionButtons的选择

时间:2018-06-18 09:03:50

标签: r shiny

我有这个shiny应用,我希望使用一组radioBuottons来确定另一组radioBuottons的选择向量。我尝试过使用conditionalPanel,但我无法弄清楚如何将不同的radioBuottons集合绑定到单个输出条目(如果可能的话)。 所以我想出了为第二组radioBuottons定义一个列表,并尝试根据第一组radioBuottons的选择来选择它们。

以下是代码示例:

ui.r:

library(shiny)

secondInput <- list(
  "a" = c("one", "two", "three"),
  "b" = c("four", "five")
)

shinyUI(fluidPage(
  titlePanel("Test reactive RadioButtons"),
    column(4,
      radioButtons("input1", label = "1st input", choices = c("a","b"))),
    column(4,
      radioButtons("input2", label = "2nd input depend on 1st input", choices = secondInput[[input$input1]])),
    column(4,
      textOutput("IN1"))
))

server.r:

library(shiny)

shinyServer(function(input, output) {
  out <- reactive(input$input1)
  output$IN1 <- renderText(out())
})

我收到一条错误消息,说明该对象已输入&#39;没找到。 我该如何管理?

2 个答案:

答案 0 :(得分:2)

我认为updateRadioButtons会更好,因为每次input1更改都不需要重新创建小部件

library(shiny)

secondInput <- list(
  "a" = c("one", "two", "three"),
  "b" = c("four", "five")
)

ui <- fluidPage(
  titlePanel("Test reactive RadioButtons"),
  column(4,radioButtons("input1", label = "1st input", choices = c("a","b"))),
  column(4,radioButtons("input2", label = "2nd input depend on 1st input", choices = "")),
  column(4,textOutput("IN1"))
)

# Define server logic
server <- function(input, output, session) {

  observeEvent(input$input1,{
    updateRadioButtons(session,"input2",choices = secondInput[[input$input1]])
  })

  out <- reactive(input$input1)
  output$IN1 <- renderText(out())
}

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

答案 1 :(得分:1)

您生成的radioButtons不是被动的。如果要使用一个输入来创建依赖于它的另一个输入或输出,则必须在服务器中的反应式表达式中为其构建逻辑。您可以使用uiOutputrenderUI。下面给出一个工作实例,希望这有帮助!

library(shiny)

secondInput <- list(
  "a" = c("one", "two", "three"),
  "b" = c("four", "five")
)

ui <- fluidPage(
  radioButtons("input1", label = "1st input", choices = c("a","b")),
  uiOutput('radiobuttons2')
)

server <- function(input, output, session) {
  output$radiobuttons2 <- renderUI({
    radioButtons('input2',label='2nd input', choices = secondInput[[input$input1]])
  })

}

shinyApp(ui, server)