【问题标题】:R Shiny - No initial value selected in radioButtons?R Shiny - 单选按钮中没有选择初始值?
【发布时间】:2017-01-24 22:45:06
【问题描述】:

来自文档:

radioButtons(inputId, label, 选择, selected = NULL, inline = FALSE, 宽度 = NULL)

参数

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

但是,您可以指定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) 可以解决问题。

【问题讨论】:

  • 好的,当您运行该代码时,会发生什么?
  • 当我运行它时,“a”按钮(第一个值)已经被选中。我不想选择任何按钮。
  • 你可以用selected = character(0)代替selected = NULL
  • 效果很好,谢谢。

标签: r radio-button shiny


【解决方案1】:

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

selected = character(0)

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

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

【讨论】:

  • selected = character(0) 替代方案很简单,但看起来确实像个 hack。我担心它可能会产生次要影响(虽然我现在想不出来)。
  • 我能想到的关闭效果是,一旦用户做出选择,那么用户就无法返回初始阶段,即没有选择单选按钮时。为了解决这个问题,可以添加一个额外的单选按钮,显示“未选择”
  • 请注意,这不适用于来自 shinyWidgets 的awesomeRadio(尽管它确实适用于radioButtons
  • @nico 是的,这是一个将近 4 年的答案......在那些年里,我离 R 开发有点远 :)
  • 哦,是的,但你的回答还是有用的!
【解决方案2】:

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

  • 使用额外的选项,例如称为 'none' 参见 radioButtons 帮助
  • 使用字符 (0)(参见 radioButtons 帮助)
  • 使用额外的 actionButton 并观察该按钮。

如果您不想使用额外的 radioButtons 选项或 actionButton 来模糊用户界面,请使用 character(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)

这可以通过使用和观察虚拟单选按钮来解决(尽管对于远程应用程序可能太慢),如下所示。

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 的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2020-09-14
    • 2020-07-12
    • 2019-10-18
    • 2014-10-27
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多