这基本上是对这个问题的详细示例的后续跟进(没有回答): conditionalPanel in shiny (doesn't seem to work)
示例app:根据用户选择显示面板(“list1”,“list2”等)。 “list3”未被选中,应不显示。
ui.R
displayList <- c("list1", "list2", "list3")
shinyUI(pageWithSidebar(
headerPanel("Shiny Display List"),
sidebarPanel(
checkboxGroupInput('dlist', 'Display List:', displayList, selected = displayList[1:2])
),
mainPanel(
h4("Display List"),
conditionalPanel(condition = "length(intersect(input.dlist, displayList[1])) > 0",
p("Some List 1 entries")
),
conditionalPanel(condition = "length(intersect(input.dlist, displayList[2])) > 0",
p("Some List 2 entries")
),
conditionalPanel(condition = "length(intersect(input.dlist, displayList[3])) > 0",
p("Some List 3 entries") #WASN'T SELECTED, SHOULD NOT DISPLAY INITIALLY
)
)
))
server.R
shinyServer(function(input, output) {
observe({cat(input$dlist, "\n")})
observe({cat(length(intersect(input$dlist, "list3")))})
})
为了测试是否满足条件,我在server.R中运行observe
并且输出显示面板3确实满足不条件(下面的“0”)。
list1 list2
0
但是,该应用仍会显示“list3”
知道为什么吗?我确实尝试过不同形式的条件(而不是使用intersect
等),但没有成功。
以答案编辑
作为@nstjhp&amp; @Julien Navarre指出,conditionalPanel
“条件”需要在Javascript中。对于上面的示例,它的工作原理如下:
conditionalPanel(condition = "input.dlist.indexOf('list1') > -1",
p("Some List 1 entries")
)
答案 0 :(得分:5)
正如@nstjhp所说,条件必须在Javascript中进入条件面板,你不能在这里插入R逻辑。
如果您想使用R语法控制输入,可以使用renderUI
:
例如:
output$panel = renderUI({
if(input$dlist[1] == TRUE) {
display something
} else if
.....
虽然在你的情况下javascript的条件差别不大。这有点像:condition = "input.dlist[0]"
。请注意,在javascript索引中,从0开始,而不是像在R中那样从1开始。
您的主要小组:
mainPanel(
h4("Display List"),
conditionalPanel(condition = "input.dlist[0]",
p("Some List 1 entries")
),
conditionalPanel(condition = "input.dlist[1]",
p("Some List 2 entries")
),
conditionalPanel(condition = "input.dlist[2]",
p("Some List 3 entries")
)
)