【问题标题】:repeated selection of same option of Shiny radioButtons重复选择 Shiny radioButtons 的相同选项
【发布时间】:2019-04-12 04:20:03
【问题描述】:

我制作了一个带有两个面板的 Shiny 应用。在第一个面板中,显示了单选按钮。选择其中一个按钮时,应用程序移动到第二面板,在此面板中,示出了所选单选按钮的值。在第二个面板中,有一个操作按钮“返回第一个面板”。

单击此按钮时,程序将返回到第一个面板。现在,当用户单击与以前相同的单选按钮时,程序不会像第一次那样移动到第二个面板。

鉴于Shiny机制,我可以理解这一点,毕竟输入(即单选按钮输入)的值没有改变。

不过,我想更改程序,使其在单击任何单选按钮时始终移动到第二个面板,即使它与之前单击的单选按钮相同。

有没有办法让程序以这种方式运行?

R代码如下:

library(shiny)

ui <- tagList(
  navbarPage(
    title=NULL, id = "navBar",
    tabPanel(title = "Panel1", uiOutput('showRadioButtons')),
    tabPanel(title = "Panel2", uiOutput('showChoice'), hr(), actionButton("goBack", "Back to first panel"))
  )
)

server <- function(input, output, session)
{
  observe({
    shinyjs::hide(selector = '#navBar li a[data-value="Panel2"]')
  })

  output$showRadioButtons <- renderUI({
    radioButtons(inputId = "entries", label = NULL, choiceNames  = c("A", "B", "C", "D"), choiceValues = c(1,2,3,4), selected = 0)
  })

  output$showChoice <- renderUI({
    if (length(input$entries)>0)
      return(input$entries) else return(NULL)

  })

  observe({
    if (length(input$entries)>0)
    {
      shinyjs::hide(selector = '#navBar li a[data-value="Panel1"]')
      shinyjs::show(selector = '#navBar li a[data-value="Panel2"]')
      updateNavbarPage(session, "navBar", selected="Panel2")
    }
  })

  observe({
    if (input$goBack>0)
    {
      shinyjs::hide(selector = '#navBar li a[data-value="Panel2"]')
      shinyjs::show(selector = '#navBar li a[data-value="Panel1"]')
      updateNavbarPage(session, "navBar", selected="Panel1")
    }
  })
}

shinyApp(ui = ui, server = server)

【问题讨论】:

  • 你能在input$goBack期间使用updateRadioButtons并更新selected=NULL吗?这样任何输入都是新的。
  • 我试过了,但没有成功。从第二个面板返回第一个时,所有选项都是(确实)取消选择,但是当然后选择与之前相同的选项时,程序不会再次移动到第二个面板。 span>
  • 你试过下面的答案吗?
  • 是的,我做到了!它仅在 updateRadioButtons 调用中更改 'selected=4' 中的 'selected=0' 并在 output$showChoice 和第一次观察中添加条件 '(input$entries!=4)' 作为条件时才有效。这样,第四个选项被用作一种虚拟选项,但我希望有一个更好的解决方案。
  • 我有 1.0.5 版的闪亮包并将其升级到 1.2.0 版,现在它可以工作了!非常感谢您的帮助!!!

标签: r shiny radio-button reactive


【解决方案1】:

我们可以通过在按下返回按钮时使用 updateRadioButtons 推送单选按钮的更新来做到这一点。

 observe({
    if (input$goBack>0)
    {
      updateRadioButtons(session,inputId = "entries", label=NULL, 
       choiceNames  = c("A", "B", "C", "D"), choiceValues = c(1,2,3,4), selected = 0)
      shinyjs::hide(selector = '#navBar li a[data-value="Panel2"]')
      shinyjs::show(selector = '#navBar li a[data-value="Panel1"]')
      updateNavbarPage(session, "navBar", selected="Panel1")
    }
  })

完整代码:

library(shiny)

ui <- tagList(
  navbarPage(
    title=NULL, id = "navBar",
    tabPanel(title = "Panel1", uiOutput('showRadioButtons')),
    tabPanel(title = "Panel2", uiOutput('showChoice'), hr(), actionButton("goBack", "Back to first panel"))
  )
)

server <- function(input, output, session)
{
  observe({
    shinyjs::hide(selector = '#navBar li a[data-value="Panel2"]')
  })

  output$showRadioButtons <- renderUI({
    radioButtons(inputId = "entries", label = NULL, choiceNames  = c("A", "B", "C", "D"), choiceValues = c(1,2,3,4), selected = 0)
  })

  output$showChoice <- renderUI({
    if (length(input$entries)>0)
      return(input$entries) else return(NULL)

  })

  observe({
    if (length(input$entries)>0)
    {
      shinyjs::hide(selector = '#navBar li a[data-value="Panel1"]')
      shinyjs::show(selector = '#navBar li a[data-value="Panel2"]')
      updateNavbarPage(session, "navBar", selected="Panel2")
    }
  })

  observe({
    if (input$goBack>0)
    {
      updateRadioButtons(session,inputId = "entries", label=NULL, 
                         choiceNames  = c("A", "B", "C", "D"), choiceValues = c(1,2,3,4), selected = 0)
      shinyjs::hide(selector = '#navBar li a[data-value="Panel2"]')
      shinyjs::show(selector = '#navBar li a[data-value="Panel1"]')
      updateNavbarPage(session, "navBar", selected="Panel1")
    }
  })
}

shinyApp(ui = ui, server = server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 2021-06-14
    • 2017-10-14
    • 2021-02-09
    • 2023-02-07
    • 1970-01-01
    • 2021-09-27
    • 2018-07-19
    相关资源
    最近更新 更多