0

在 Shiny 中,我想要两个(漂亮的)开关,我可以离开:

  • 取消选择,
  • 或一次只选择一个。

然后,所需的行为将是第一个开关TRUE自动将第二个开关的值设置为FALSE. 反之亦然。

我尝试使用以下脚本,但它没有按预期工作。实际上,在正确更改值之前,我需要在开关上单击两次。

library(shiny)
library(shinyWidgets)

# Define UI
ui <- fluidPage(
    
    # Application title
    titlePanel("Update the switch"),
    
    # Pretty switches 
    prettySwitch('one', 'one'),
    prettySwitch('two', 'two')
    
)

# Define server logic
server <- function(input, output) {
    
    observeEvent({input$one == TRUE}, {
        updateCheckboxInput(
            inputId = "two",
            value = F
        )
    })
    
    observeEvent({input$two == TRUE}, {
        updateCheckboxInput(
            inputId = "one",
            value = F
        )
    })
}

# Run the application 
shinyApp(ui = ui, server = server)
4

1 回答 1

1

我认为问题在于您如何放置observeEvent,只需使其依赖于按钮,不要在第一个参数中指定条件,您可以在其内部完成其余操作observeEvent。此外,一个好的建议是坚持使用bool:TRUE和的完整定义FALSE,尽量不要将其缩写为一种好习惯

library(shiny)
library(shinyWidgets)

# Define UI
ui <- fluidPage(
    
    # Application title
    titlePanel("Update the switch"),
    
    # Pretty switches 
    prettySwitch('one', 'one'),
    prettySwitch('two', 'two')
    
)

# Define server logic
server <- function(input, output,session) {
    
    observeEvent(input$one, {
        if(input$one == TRUE){
            updateCheckboxInput(session,inputId = "two",value = FALSE)
        }
    }, ignoreInit = TRUE)
    
    observeEvent(input$two,{
        if(input$two == TRUE){
            updateCheckboxInput(session,inputId = "one",value = FALSE)
        }
    }, ignoreInit = TRUE)
}

# Run the application 
shinyApp(ui = ui, server = server)

在此处输入图像描述

于 2021-04-22T09:53:42.433 回答