R Shiny - 在radioButtons中没有选择初始值?

时间:2016-09-16 16:14:04

标签: r radio-button shiny

来自文档:

  

radioButtons(inputId,label,choices,selected = NULL,inline = FALSE,     width = NULL)

     

参数

     

已选择最初选择的值(如果未指定,则默认为第一个值)

但是,你能指定selected参数,以便渲染的radioButtons没有选择初始值吗?此初始值的输出可以是空字符串("")。在下面的示例中,应用程序运行时不应选择“a”和“b”。

library(shiny)

runApp(
  list(
    ui = shinyUI(
      fluidPage(
        radioButtons("test","test",choices=c("a","b"),selected = NULL),
        verbatimTextOutput("value")
      )
    ), server = shinyServer(function(input, output,session) {
      output$value <- renderText(input$test)
    })
  )
)

更新

正如Hackerman所说,selected = character(0)可以解决问题。

2 个答案:

答案 0 :(得分:7)

selected的问题是,如果未指定,则默认为第一个值。但您可以使用以下方法解决此问题:

selected = character(0)

另一种方法是提供默认选项,例如Nothing Selected

radioButtons("test","test",choices=c("Nothing Selected"="","a"="a","b"="b"),selected = NULL),

答案 1 :(得分:1)

假设您不想要初始值,因为它会被观察到,似乎有3个解决方案:

  • 使用额外选项,例如叫'无'见radioButtons帮助
  • 使用字符(0)(参见radioButtons帮助)
  • 使用额外的actionButton ond,而不是观察该按钮。

如果您不想使用额外的radioButtons选项或actionButton来模糊您的用户界面,请使用字符(0)。

但是,使用'character(0)'时,您可能还需要解决副作用。问题是'character(0)'将将输入参数重置为NULL,因此您不能使用相同的选项两次(这可能是也可能不是)。这显示在以下示例程序。

server <- function(input, output) {
output$uiRadioButtons <- renderUI({ radioButtons (inputId='actionId', label='action:', choices = c ('a', 'b', 'c'), selected=character(0)) })
n  <- 0
observe({
    actionId <- input$actionId
    n <<- n+1
    if (!is.null(actionId)) {
        if (actionId=='a')  output$action  <- renderText (paste (n, "action A"))
        if (actionId=='b')  output$action  <- renderText (paste (n, "action B"))
        if (actionId=='c')  output$action  <- renderText (paste (n, "action C"))
        output$uiRadioButtons <- renderUI({ radioButtons (inputId='actionId', label='action:', choices = c ('a', 'b', 'c'), selected=character(0)) })
    } else                  output$action  <- renderText ("actionId equals NULL")
}) } 
ui <- fluidPage (
    sidebarLayout(
        sidebarPanel ( uiOutput('uiRadioButtons')),
        mainPanel    (uiOutput('action'))
    ) ) 
shinyApp (ui = ui, server = server)

通过使用和观察虚拟radioButtons,可以解决这个问题(尽管对于远程应用程序来说可能太慢)。

server <- function(input, output) {
showActions <- function() {
    output$uiRadioButtons <- renderUI ({ radioButtons (inputId='actionId', label='action:', choices = c ('a', 'b', 'c'), selected=character(0)) })
}
showActions()
n  <- 0
observe({
    actionId <- input$actionId
    n <<- n+1
    if (!is.null(actionId)) {
        if (actionId=='dummy')  showActions ()
        else {
            if (actionId=='a')  output$action  <- renderText (paste (n, "action A"))
            if (actionId=='b')  output$action  <- renderText (paste (n, "action B"))
            if (actionId=='c')  output$action  <- renderText (paste (n, "action C"))
            output$uiRadioButtons <- renderUI({ radioButtons (inputId='actionId', label='action:', choices = 'dummy') })
        }
    } else                  output$action  <- renderText ("actionId equals NULL")

})
}
ui <- fluidPage (
    sidebarLayout(
        sidebarPanel (
            # radioButtons (inputId='objectId', label='selct object:', choices = c ('o1', 'o2', 'o3'), inline = TRUE),
            uiOutput('uiRadioButtons')
        ),
        mainPanel    (uiOutput('action'))
    )
)
shinyApp (ui = ui, server = server)

它看起来很难看,但它很有效,我很高兴,如果有人能给我看一个更好的解决方案,例如一种将输入变量重置为NULL的方法。