Сохраненные значения ввода в блестящих виджетах?

Я пытаюсь понять значение, хранящееся в shiny inputwidgets. Я написал ниже код, который выводит sliderInput и на основе значения sliderInput, создается другой элемент o/p i.e.

Если sliderInput значение > 30, то он генерирует groupedradiobutton иначе он генерирует a file upload button

library(shiny)
library(shinyWidgets)
ui <- fluidPage(
  sliderInput(inputId = "num", 
              label = "Choose a number", 
              value = 25, min = 1, max = 100),
  uiOutput("uploadorSelect"),
  textOutput("RadioButtonValue")
)

server <- function(input, output) {
  output$uploadorSelect <- renderUI({
    x<-input$num

    if( x > 30 ){
      # render grouped radio buttons  
      radioGroupButtons(inputId = "opbAppendRemoveMonthlyOption",choices =c("Append","Continue"), status = "success",
                        direction = "horizontal",justified = F,checkIcon = list(yes=icon("ok",lib="glyphicon")),selected = character(0))

    }else{
      # render upload button
      fileInput(inputId="btnUploadMonthlyFile",label = "Upload Monthly Data file") 
    }
  })

  output$RadioButtonValue<-renderText({
    x<-(input$opbAppendRemoveMonthlyOption)
    return(x)

  })
}

shinyApp(ui = ui, server = server)

Ситуация: -

Шаг 1 - я изменил значение sliderInput на значение 31, которое генерирует groupedradiobutton, а затем я выбираю Append из радиоблока

Шаг 2 - я снова изменил значение sliderInput на 32, которое регенерирует groupedradiobutton, которое, как мне кажется, должно reset значение input$opbAppendRemoveMonthlyOption, используемое в блоке output$RadioButtonValue как Null, но вместо этого оно все еще сохраняет значение, выбранное в шаге 1

Я думаю, это связано с тем, что когда я ссылаюсь на input$opbAppendRemoveMonthlyOption в output$RadioButtonValue, он возвращает кешированное значение? если это так, как можно установить значение по умолчанию каждый раз, когда я изменяю значение sliderInput?

Ответ 1

Ваше приложение настроено правильно, но проблема связана с сообщением о том, что новое значение для opbAppendRemoveMonthlyOption "ничего не выбрано" теряется. Например, если вы измените параметр по умолчанию selected на "Продолжить", тогда он получает reset правильно каждый раз при изменении ползунка.

Обычно вы также можете использовать соответствующую функцию обновления в реактивном выражении, чтобы изменить значение ввода следующим образом:

  observeEvent({input$num}, {
    updateRadioGroupButtons(session, "opbAppendRemoveMonthlyOption",
                            selected = character(0))
  })

Однако, как и при создании ввода, это сообщение игнорируется при попытке вернуть значение в невыбранное состояние, но работает, если установить его в один из параметров. Обратите внимание, что использование невыделенного состояния не рекомендуется в документации Shiny (?radioButtons), поэтому может быть не полностью поддержано.

Если вам нужно представить состояние "None selected", возможно, для переключателей по умолчанию не будет выбранных опций, используя выбранный символ = (0). Однако это не рекомендуется, так как это дает пользователю возможность вернуться в это состояние после того, как они сделали выбор. Вместо этого подумайте, что первый из ваших вариантов будет c ( "None selected" = "").

Вы можете обойти это с помощью немного JavaScript, чтобы значение input было reset при каждом щелчке ползунка.

library(shiny)
library(shinyWidgets)
ui <- fluidPage(
  tags$div(
    sliderInput(inputId = "num", 
                label = "Choose a number", 
                value = 25, min = 1, max = 100),
    onchange = "Shiny.onInputChange('opbAppendRemoveMonthlyOption', '')"
  ),
  uiOutput("uploadorSelect"),
  textOutput("RadioButtonValue")
)

server <- function(input, output) {
  output$uploadorSelect <- renderUI({
    x<-input$num

    if( x > 30 ){
      # render grouped radio buttons  
      radioGroupButtons(inputId = "opbAppendRemoveMonthlyOption",choices =c("Append","Continue"), status = "success",
                        direction = "horizontal",justified = F,checkIcon = list(yes=icon("ok",lib="glyphicon")),selected = character(0))

    }else{
      # render upload button
      fileInput(inputId="btnUploadMonthlyFile",label = "Upload Monthly Data file") 
    }
  })

  output$RadioButtonValue<-renderText({
    x<-(input$opbAppendRemoveMonthlyOption)
    return(x)

  })
}

shinyApp(ui = ui, server = server)

Дополнительная информация Shiny ↔ JavaScript-сообщения от RStudio.com