闪亮的小部件中存储的输入值?

时间:2018-01-08 14:02:39

标签: r shiny shiny-reactivity

我想了解shiny inputwidgets中存储的值。我写了下面的代码输出sliderInput并根据sliderInput的值生成另一个o / p元素,即

如果sliderInput值>然后它产生分组的放射性 否则它会生成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,生成分组放置按钮,然后从radiobutton中选择Append

第2步 - 我再次将sliderInput的值更改为32,重新生成了groupsradiobutton,我认为应该将input$opbAppendRemoveMonthlyOption块中使用的output$RadioButtonValue的值重置为Null,但是它仍然是保留在Step1中选择的值

我认为这是因为当我在input$opbAppendRemoveMonthlyOption中引用output$RadioButtonValue时,它会返回缓存的值吗?如果是这样的话,每当我更改sliderInput的值时,如何将值设置为默认值?

1 个答案:

答案 0 :(得分: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)

More info Shiny<->JavaScript messaging from RStudio.com