我想使用一组if
和else
语句来选择要使用的tabsetPanel
。我们的想法是在用户执行先决条件任务时显示新选项卡。我创建的内容似乎尝试这样做,但重新加载现有选项卡,重置选项卡的状态,从而删除刚刚添加的选项卡。在我的示例中,您可以看到第二个选项卡闪存,然后消失。如何重新创建tabsetPanel
时,如何使每个标签中的输入保持不变?我读了对a similar question的回复,但我不熟悉javascript(或该回答中tags$script
内的任何代码),所以我想要一个只需要R代码的解决方案。
代码粘贴在下方,也是available on github。
library(shiny)
shinyUI(pageWithSidebar(
headerPanel("Subset data before analyzing"),
sidebarPanel(),
mainPanel(uiOutput("Panels"))
))
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())
)
})
})
答案 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存储库中找到。