将radioButtons重置为闪亮到空值

问题描述 投票:0回答:2

是否有可能在闪亮的情况下将radioButton重置为空值(即好像无线电按钮没有被点击且默认值为空(选择=“”))?

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

重置为空值将使得可以在所述选择实验中使用单组无线电按钮用于许多重复选择(与renderUI组合,其中无线电按钮被连续地分配给不同的变量。

r shiny radio-button reset
2个回答
1
投票

如果您希望用户能够恢复到原始的无选择状态,则通常同意(尽管当然没有基于意见的是100%)不应使用单选按钮。即使是闪亮的单选按钮文档也说明了这一点:

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

如果您在网上查询讨论,您还会发现通常认为没有初始选择的单选按钮是可以的,但需要注意的是,通常这意味着用户在进行选择后无法返回到该状态,因为取消选择是没有真正由单选按钮支持。

UPDATE

使用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)

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)

考虑使用复选框gorup作为替代方案?

Edit

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领域。

Edit 2 Custom javascript solution

这是评论中讨论的自定义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)

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.