当不满足条件时,R Shiny conditionalPanel显示

har*_*mug 7 r shiny

这基本上是一个跟进这个问题的详细例子(没有答案通过): conditionalPanel in shiny(似乎不起作用)

示例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
    )
  )
))
Run Code Online (Sandbox Code Playgroud)

server.R

shinyServer(function(input, output) {
  observe({cat(input$dlist, "\n")})
  observe({cat(length(intersect(input$dlist, "list3")))})
})
Run Code Online (Sandbox Code Playgroud)

为了测试,如果条件被满足,我跑observe在server.R和输出显示确实条件是符合面板3("0"以下).

list1 list2 
0
Run Code Online (Sandbox Code Playgroud)

但是,应用程序仍显示"list3"

在此输入图像描述

知道为什么吗?我确实尝试了不同形式的条件(而不是使用intersect等),但没有成功.

用答案编辑

正如@nstjhp和@Julien Navarre指出的那样,conditionalPanel"条件"需要在Javascript中.对于上面的示例,它的工作原理如下:

conditionalPanel(condition = "input.dlist.indexOf('list1') > -1",
      p("Some List 1 entries")
    )
Run Code Online (Sandbox Code Playgroud)

Jul*_*rre 5

正如@nstjhp所说条件必须在Javascript中进入条件面板,你不能在这里插入R逻辑.

如果要使用R语法控制输入,可以使用renderUI:

例如 :

output$panel = renderUI({
    if(input$dlist[1] == TRUE) {
        display something 
    } else if 
.....
Run Code Online (Sandbox Code Playgroud)

虽然在你的情况下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")
  )
)
Run Code Online (Sandbox Code Playgroud)