【发布时间】: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