在Shiny中,如何在没有javascript等的情况下一次显示一个标签

时间:2015-04-01 17:37:49

标签: r shiny

我想使用一组ifelse语句来选择要使用的tabsetPanel。我们的想法是在用户执行先决条件任务时显示新选项卡。我创建的内容似乎尝试这样做,但重新加载现有选项卡,重置选项卡的状态,从而删除刚刚添加的选项卡。在我的示例中,您可以看到第二个选项卡闪存,然后消失。如何重新创建tabsetPanel时,如何使每个标签中的输入保持不变?我读了对a similar question的回复,但我不熟悉javascript(或该回答中tags$script内的任何代码),所以我想要一个只需要R代码的解决方案。

该应用为available on shinyapps

代码粘贴在下方,也是available on github

ui.R

library(shiny)
shinyUI(pageWithSidebar(
  headerPanel("Subset data before analyzing"),
  sidebarPanel(),
  mainPanel(uiOutput("Panels"))
))

server.R

library(shiny)
shinyServer(function(input, output) {  

  #This is the data
  d1 = data.frame(
    Student = c("Abe","Bill","Clare","Abe","Bill","Clare"),
    Class = c("ELA","ELA","ELA","Math","Math","Math"),
    Grade = c(71,72,73,74,75,76))

  # This pulls a list of unique names from the Student column of the data and creates a checklist
  output$StudentCheckList <- renderUI({
    if(is.null(d1)){return ()
    } else tagList(
      checkboxGroupInput(inputId = "SelectedStudents", 
                         label = "Which students you like to select?", 
                         choices = unique(as.character(d1$Student)))
    )
  })

  #This pulls a list of unique names from the Class column of the data and creates a checklist
  output$ClassCheckList <- renderUI({
    if(is.null(d1)){return ()
    } else tagList(
      checkboxGroupInput(inputId = "SelectedClasses", 
                         label = "Which classes would you like to select?", 
                         choices = unique(as.character(d1$Class)))
    )
  })

  # This generates the table of data subsetted by the checklist selections
  output$Summary = renderTable({
    if(is.null(d1)){return ()
    } else {
      d3 = d1[which(as.character(d1$Student) %in% input$SelectedStudents),]
      d3 = d3[which(as.character(d3$Class) %in% input$SelectedClasses),]
      return(d3)
    }
  })

    # These are the definitions for the individual panels
  p1 = reactive(tabPanel("Pick Students",uiOutput("StudentCheckList")))
  p2 = reactive(tabPanel("Pick Classes",uiOutput("ClassCheckList")))
  p3 = reactive(tabPanel("Summary",tableOutput("Summary")))

  # This generates the actual panel layout
  output$Panels = renderUI({
    tagList(
      if(is.null(d1)){return()
      } else if (length(input$SelectedStudents)==0){tabsetPanel(p1())
      } else if (length(input$SelectedClasses)==0){tabsetPanel(p1(),p2())
      } else tabsetPanel(p1(),p2(),p3())
      )
  })
})

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。它涉及一些组件。

首先,我必须创建tabsetPanel函数的新版本(我称之为tabsetPanel2。它与tabsetPanel基本相同,只是它删除了任何tabPanel tabPanel这样,任何不应出现的tabsetPanel个对象都可以设置为NULL,并且对tabPanel的调用不必更改。

其次,我必须创建一个反应对象,其中包含用户在selected上驻留的每个窗口小部件上所做的选择,并将窗口小部件的tabsetPanel2参数设置为该反应对象。这样,当重建tabsetPanel2时,它会加载先前输入的信息。

第三,我必须创建一个反应对象来保存所选标签的名称。这样,当重建Vec& Vec::operator+=(const double x) { return apply([x](double y) {return x + y;}); } Vec& Vec::operator-=(const double x) { return apply([x](double y) {return x - y;}); } Vec& Vec::operator*=(const double x) { return apply([x](double y) {return x * y;}); } Vec& Vec::operator/=(const double x) { return apply([x](double y) {return x / y;}); } 时,它会自动转到用户刚刚开启的标签页。

所有代码都可以在问题中提到的github存储库中找到。