将闪亮的单选按钮重置为空值

时间:2019-02-19 18:40:36

标签: r shiny radio-button reset

是否可以通过闪亮的方式将radioButtons重置为空值(即好像没有单击单选按钮并且默认值是空的(selected =“”))?

我尝试了使用Shinyjs()和updateRadioButtons(session,“ btn”,...)进行reset(“ btn”)。但是,我只设法将单选按钮重置为特定值(例如,列表中的第一个值或另一个预定义值),而不重置为空值。

重置为空值将可以在指定的选择实验中将一组单选按钮用于许多重复选择(与renderUI组合,其中单选按钮先后被分配给不同的变量。

4 个答案:

答案 0 :(得分:1)

通常已同意(当然,基于意见的当然不是100%),如果您希望用户能够恢复到原始的未选择状态,则不应使用单选按钮。甚至闪亮的单选按钮文档也这样说:

  

如果需要表示“未选中”状态,则可以通过使用selected = character(0)将单选按钮默认为不选择任何选项。但是,不建议这样做,因为一旦用户做出选择,它就使用户无法返回到该状态。相反,请考虑将第一个选项设为c(“ None selected” =“”“)。

如果您在网上查找讨论,还会发现通常认为没有初始选择的单选按钮是可以的,但要注意的是,这通常意味着用户在做出选择后无法回到该状态,因为单选按钮本身并不真正支持选择。

更新

使用updateRadioButtons()进行的更新可能出现可以直观地工作,但实际上并没有将值重置为未选择。输入的基础值不变。这是证明:

library(shiny)

ui <- fluidPage(
  radioButtons("btn","Click Me",choices  = c("Choice 1","Choice s"),selected = character(0)),
  actionButton("clickMe","Click Me to Reset"),
  actionButton("showValue", "Show value")
)

server <- function(input, output, session) {
  observeEvent(input$clickMe,{
    updateRadioButtons(session,"btn",choices  = c("Choice 1","Choice s"),selected = character(0))
  })

  observeEvent(input$showValue, {
    print(input$btn)
  })
}

shinyApp(ui, server)

答案 1 :(得分:0)

同意@Dean Attali。但是,如果绝对需要(不推荐),

library(shiny)

ui <- fluidPage(
  radioButtons("btn","Click Me",choices  = c("Choice 1","Choice s"),selected = character(0)),
  actionButton("clickMe","Click Me to Reset")
)

server <- function(input, output, session) {
  observeEvent(input$clickMe,{
    updateRadioButtons(session,"btn",choices  = c("Choice 1","Choice s"),selected = character(0))
  })
}

shinyApp(ui, server)

考虑使用复选框木棍作为替代品吗?

编辑

library(shiny)

ui <- fluidPage(
  radioButtons("btn","Click Me",choices  = c("Choice 1","Choice s"),selected = character(0)),
  actionButton("clickMe","Click Me to Reset"),
  actionButton("showValue", "Show value")
)

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

  selected = reactiveVal(NULL)

  observeEvent(input$clickMe,{
    updateRadioButtons(session,"btn",choices  = c("Choice 1","Choice s"),selected = character(0))
    selected(NULL)
  })

  observeEvent(input$btn,{
    selected(input$btn)
  })


  observeEvent(input$showValue, {
    print(selected())
  })
}

shinyApp(ui, server)

您可以使用反应性val作为代理。但是我们在这里进入了真正的hacky领域。

编辑2个自定义javascript解决方案

这是评论中讨论的自定义javascript解决方案。在此解决方案中,如果用户双击单选按钮,它将变为未选中状态。您可以通过按钮再次检查该值。请注意,您不会参考input$btn来获取按钮值。使用input$radio_click创建自定义值。

library(shiny)

ui <- fluidPage(
  tags$script(HTML("
              window.onload = function(){
                 var btns = document.getElementById('btn');
                 btns_radio = btns.getElementsByTagName('input');

                 for(var i = 0; i < btns_radio.length; i++){
                   btns_radio[i].addEventListener('click',function(x){
                      Shiny.onInputChange('radio_click', this.value)
                   });

                   btns_radio[i].addEventListener('dblclick',function(x){
                      if(this.checked){
                        this.checked = false;
                        Shiny.onInputChange('radio_click', null)
                      }
                   })
                   }
                 }
              ")),
  radioButtons("btn","Click Me",choices  = c("Choice 1","Choice s"),selected = character(0)),
  actionButton("showValue", "Show value")
)

server <- function(input, output, session) {
  observeEvent(input$showValue, {
    print(input$radio_click)
  })
}

shinyApp(ui, server)

答案 2 :(得分:0)

@DeanAttali有一个正确的主意。

resetRadioGroup = (formName, radioGroupName) => {
    let form = document.forms[formName],
        radioGroup = form && form.elements[radioGroupName],
        selectedValue = radioGroup && radioGroup.value,
        selectedRadio = form.querySelector(`[value=${selectedValue}]`);

    if(selectedRadio){
        selectedRadio.checked = undefined;
    }
}

答案 3 :(得分:0)

每次radioButtons()生成新的renderUI()时,可以为radioButtons()生成新的id。这样,您总是在开始时获得NULL值。


shinyServer(function(input, output, session) {

radio_id <- "first_time"

  output$test <- rederUI({
    radio_id <<- paste0("but", gsub("\\s+|:", "", Sys.time()))
  
    radioButtons(
        inputId = radio_id,
        label = "Choose the correct answer",
        inline = TRUE,
        choices = t_item$choices, 
        selected = character(0)
    )
  
  })

}