Сброс radioButtons в блестящем к пустому значению - PullRequest
0 голосов
/ 19 февраля 2019

Возможно ли в блестящем сбросить radioButtons к пустому значению (то есть, как если бы радио кнопки не были нажаты, а значение по умолчанию было пустым (selected = ""))?

Я попытался сбросить ("btn") с блестящим () и updateRadioButtons (сеанс, "btn", ...).Однако мне удалось только сбросить радиокнопки на определенное значение (например, первое значение в списке или другое предопределенное значение), но не на пустое значение.

Сброс на пустое значение сделает это возможнымиспользовать один набор радиокнопок для множества повторных выборов в заданном эксперименте с выбором (в сочетании с renderUI, где радиокнопки последовательно назначаются различным переменным.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Согласен с @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 в качестве альтернативы?

Изменить

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 как прокси.Но мы попадаем в настоящую хакерскую территорию.

Редактировать 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)
0 голосов
/ 02 августа 2019

@ Дин Аттали имеет правильную идею.

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;
    }
}
0 голосов
/ 19 февраля 2019

В целом согласны (хотя, конечно, ничто не основано на мнении на 100%), что переключатели не должны использоваться, если вы хотите, чтобы пользователь мог вернуться к исходному состоянию без выбора.Даже в документации по переключателям в блестящем написано следующее:

Если вам нужно представить состояние «Нет выбранных», возможно по умолчанию переключатели не имеют опций, выбранных с помощью символа selected = (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)
...