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

R 将闪亮中的单选按钮重置为空值,r,shiny,radio-button,reset,R,Shiny,Radio Button,Reset,在shiny中是否可以将radioButtons重置为空值(即,如果没有单击radioButtons,默认值为空(selected=“”)) 我用shinyjs()和updateRadioButtons(会话,“btn”,…)尝试重置(“btn”)。但是,我只将单选按钮重置为特定值(例如列表中的第一个值或其他预定义值),而不是空值 重置为空值将使在规定的选择实验中使用一组单选按钮进行多次重复选择成为可能(结合renderUI,其中单选按钮被依次分配到不同的变量。这是普遍同意的(当然,没有任何意见

在shiny中是否可以将radioButtons重置为空值(即,如果没有单击radioButtons,默认值为空(selected=“”))

我用shinyjs()和updateRadioButtons(会话,“btn”,…)尝试重置(“btn”)。但是,我只将单选按钮重置为特定值(例如列表中的第一个值或其他预定义值),而不是空值


重置为空值将使在规定的选择实验中使用一组单选按钮进行多次重复选择成为可能(结合renderUI,其中单选按钮被依次分配到不同的变量。

这是普遍同意的(当然,没有任何意见是100%)如果您希望用户能够恢复到原始的无选择状态,则不应使用单选按钮。即使是shiny中单选按钮的文档也指出:

如果你需要代表一个“没有被选择”的状态,可以通过使用选择的=字符(0)来默认单选按钮没有选项。但是,这是不推荐的,因为一旦用户进行了选择,它就不能让用户返回到那个状态。“”)

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

更新

使用
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)
库(闪亮)

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


@迪纳塔利的想法是正确的

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;
    }
}

另一种方法是每次
renderUI()
生成一个新的
radioButtons()
时,为
radioButtons()
生成一个新的id。这样一来,您总是在开始时得到一个空值

shinyServer(功能(输入、输出、会话){

radio_id I trusted selected=字符(0),但没有解决问题。radio按钮看起来是空的,但变量input$btn保留最新选择的值,这样所有上游选择默认都会收到最新选择的值。这实际上不会更改输入的值(这只会使视觉外观看起来像是未选中的)。有关详细信息,请参阅我答案的更新proof@DeanAttali有趣。是的,“未选择”选项似乎是唯一的方法。是否也可以重置基础输入变量的值?我尝试了updateNumericInput(会话,“btn”,value=“”)但是id没有效果。“非选择”选项起作用,但很难看。选择实验是高度标准化的,提供非选择选项是不寻常的(而且相当令人困惑)。我在考虑使用javascript取消选中单选按钮并将输入值设置为空:)不幸的是,没有优雅的解决方案!
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)
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)
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;
    }
}