【问题标题】:R Shiny: Clicking button in tab hides button/questions/radio buttons and displays results in the same tab insteadR Shiny:单击选项卡中的按钮隐藏按钮/问题/单选按钮并在同一选项卡中显示结果
【发布时间】:2022-02-02 00:02:28
【问题描述】:

我有一个包含 n 个问题的选项卡,每个问题都与李克特风格的单选按钮相关联。我想以多种不同的方式(绘图等)显示所选答案,而无需切换到或创建其他选项卡。相反,我想在用于问题/单选按钮的同一选项卡中显示结果,即按下按钮隐藏问题、单选按钮和提交按钮,并显示例如带有结果的绘图或表格.

我创建了一个 MWE 来说明我目前的方法。因为我不知道如何最好地解决这个问题,所以我创建了三个不同的选项卡,名为 QuestionsResultsHide,目的是隐藏 Results 选项卡,直到单击提交按钮,这将显示 @987654325 @ 选项卡并隐藏 Questions 选项卡。我还没有找到隐藏Questions 标签的方法,这就是我创建Hide 标签作为测试的原因。

library(shiny)
library(shinyjs)

ui <- tagList(
    useShinyjs(),
    navbarPage(
        "Hide questions/buttons and display results in same tab",
        id = "navbar",
        tabPanel(title = "Questions",
                 id = "questions",
                 h1("Example questions"),
                 uiOutput("myradios"),
                 actionButton("button", "Run analysis")
        ),
        tabPanel(
            title = "Results",
            value = "results",
            tableOutput("tableOutput"),
            h1("Here are the results"),
            textOutput("txt")
        ),
        tabPanel(
            title = "Hide",
            value = "hide",
            h1("This tab will be hidden when the button in 'Questions' tab is clicked")
        )
    )
)

server <- function(input, output, session) {
    observe({
        hide(selector = "#navbar li a[data-value=results]")
        show(selector = "#navbar li a[data-value=hide]")
    })
    
    output$tableOutput <- renderTable({
        if(input$button > 0){
            toggle(selector = "#navbar li a[data-value=results]")
            toggle(selector = "#navbar li a[data-value=hide]")
        }else{
            NULL
        }
    })
    outputOptions(output, "tableOutput", suspendWhenHidden=F)
    
    nameList <- c("Q1", "Q2")
    questionList <- c("This is question 1", "This is question 2")
    
    all_radios <- list()
    for (i in 1:length(nameList)) {
        all_radios[[i]] <- p(radioButtons(nameList[i], questionList[i], c("Disagree strongly" = "1", "Disagree a little" = "2","Neutral; no opinion" = "3","Agree a little" = "4","Agree strongly" = "5"), inline=T, selected=0))
    }
    
    output$myradios <- renderUI(all_radios)
    
    output$txt <- renderText({
        return(paste("The answers are:", input$Q1, "and", input$Q2, sep=" "))
    })
    
    
}
shinyApp(ui = ui, server = server)

除了上面描述的明显之外,这段代码还有很多问题。例如,再次单击提交按钮会再次隐藏“结果”选项卡。

我将非常感谢任何形式的帮助或指点。

编辑:

感谢@YBS 的回答,这是有效的解决方案,在单击按钮后也将其隐藏:

library(shiny)
library(shinyjs)

ui <- tagList(
    useShinyjs(),
    navbarPage(
        "Hide questions/buttons and display results in same tab",
        id = "navbar",
        tabPanel(title = "Questions",
                 id = "questions",
                 h1("Example questions"),
                 uiOutput("myradios"),
                 textOutput("txt"),
                 actionButton("button", "Run analysis")
        )
    )
)

server <- function(input, output, session) {
        
    nameList <- c("Q1", "Q2")
    questionList <- c("This is question 1", "This is question 2")
    
    all_radios <- list()
    for (i in 1:length(nameList)) {
        all_radios[[i]] <- p(radioButtons(nameList[i], questionList[i], c("Disagree strongly" = "1",
                                                                          "Disagree a little" = "2",
                                                                          "Neutral; no opinion" = "3",
                                                                          "Agree a little" = "4",
                                                                          "Agree strongly" = "5"),
                                          inline=T,
                                          selected=0))
    }
    
    output$myradios <- renderUI(all_radios)
    
    output$txt <- renderText({
        return(paste("The answers are:", input$Q1, "and", input$Q2, sep=" "))
    })
    
    
    observeEvent(input$button, {
        k <- input$button %% 2
        if (k==1) {
            hide("myradios")
            show("txt")
            hide("button")
        }else {
            show("myradios")
            hide("txt")
        }
    }, ignoreNULL = FALSE)
    
}
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny radio-button show-hide shinyjs


    【解决方案1】:

    也许你正在寻找这个。

    library(shiny)
    library(shinyjs)
    
    ui <- tagList(
      useShinyjs(),
      navbarPage(
        "Hide questions/buttons and display results in same tab",
        id = "navbar",
        tabPanel(title = "Questions",
                 id = "questions",
                 h1("Example questions"),
                 uiOutput("myradios"),
                 textOutput("txt"),
                 actionButton("button", "Run analysis")
        ),
        tabPanel(
          title = "Results",
          value = "results",
          tableOutput("tableOutput"),
          h1("Here are the results"),
          textOutput("txt1")
        ),
        tabPanel(
          title = "Hide",
          value = "hide",
          h1("This tab will be hidden when the button in 'Questions' tab is clicked")
        )
      )
    )
    
    server <- function(input, output, session) {
      observe({
        hide(selector = "#navbar li a[data-value=results]")
        show(selector = "#navbar li a[data-value=hide]")
      })
      
      output$tableOutput <- renderTable({
        if(input$button > 0){
          toggle(selector = "#navbar li a[data-value=results]")
          toggle(selector = "#navbar li a[data-value=hide]")
        }else{
          NULL
        }
      })
      outputOptions(output, "tableOutput", suspendWhenHidden=F)
      
      nameList <- c("Q1", "Q2")
      questionList <- c("This is question 1", "This is question 2")
      
      all_radios <- list()
      for (i in 1:length(nameList)) {
        all_radios[[i]] <- p(radioButtons(nameList[i], questionList[i], c("Disagree strongly" = "1", "Disagree a little" = "2","Neutral; no opinion" = "3","Agree a little" = "4","Agree strongly" = "5"), inline=T, selected=0))
      }
      
      output$myradios <- renderUI(all_radios)
      
      output$txt <- renderText({
        return(paste("The answers are:", input$Q1, "and", input$Q2, sep=" "))
      })
      output$txt1 <- renderText({
        return(paste("The answers are:", input$Q1, "and", input$Q2, sep=" "))
      })
      
      observeEvent(input$button, {
        k <- input$button %% 2
        #print(k)
        if (k==1) {
          hide("myradios")
          show("txt")
        }else {
          show("myradios")
          hide("txt")
        }
      }, ignoreNULL = FALSE)
      
    }
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 非常感谢@YBS——这正是我想要的!感谢您的代码示例,我终于明白了如何在 Shinyjs 中使用隐藏和显示。下一步将禁用该按钮,直到所有单选按钮都被选中。我也会用你的代码更新我原来的问题。再次感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多