10

我试图了解存储在shiny inputwidgets. 我在下面编写了输出a的代码,sliderInput并且基于sliderInput的值,生成了另一个o / p元素,即

如果sliderInputvalue > 30 那么它会生成 groupedradiobutton 否则它会生成一个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从 radiobutton 中进行选择

第 2 步 - 我再次将滑块输入的值更改为 32,它重新生成分组单选按钮,我认为应该将块中input$opbAppendRemoveMonthlyOption使用的值重置output$RadioButtonValue为 Null,但它仍然保留在第 1 步中选择的值

我认为这是因为当我引用 它input$opbAppendRemoveMonthlyOptionoutput$RadioButtonValue返回缓存值?如果是这样,每次更改sliderInput的值时如何将值设置为默认值?

4

1 回答 1

5

您的应用程序设置正确,但问题似乎在于新值opbAppendRemoveMonthlyOption“未选择”的消息丢失。例如,如果您将默认selected选项更改为“继续”,那么每次更改滑块时它都会正确重置。

通常,您还可以在反应式表达式中使用相应的更新函数来更改输入的值,如下所示:

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

但是,就像在创建输入时一样,尝试将值设置回未选中状态时会忽略此消息,但如果将其设置为选项之一则有效。请注意,在 Shiny 文档 ( ?radioButtons) 中不鼓励使用未选择状态,因此可能不完全支持它。

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

您可以使用一点 JavaScript 来解决此问题,以在input单击滑块时强制重置该值。

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)

来自 RStudio.com 的更多信息 Shiny<->JavaScript 消息传递

于 2018-01-10T22:49:30.203 回答