【问题标题】:R Shiny conditionalPanel displays when condition is not met不满足条件时显示 R Shiny conditionalPanel
【发布时间】:2014-04-13 20:44:21
【问题描述】:

这本质上是对这个问题的详细示例的后续跟进(没有得到答案): conditionalPanel in shiny (doesn't seem to work)

示例应用:根据用户选择显示面板(“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 和@Julien Navarre 所指出的,conditionalPanel“条件”需要在 Javascript 中。对于上面的示例,它的工作原理如下:

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

【问题讨论】:

  • 条件必须是 Javascript 而不是 R。
  • 感谢您的评论。我正在尝试'input.dlist in "list3"'"input.dlist.indexOf('list3') &gt; -1" 等的变体,但我的 JS-foo 很弱。有什么帮助吗? input.dlist 甚至是一个数组吗?使用:stackoverflow.com/questions/1181575/…

标签: r shiny


【解决方案1】:

正如@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")
  )
)

【讨论】:

  • 谢谢!我更喜欢第二种选择,因为它的应用更直接。但是,从我对@nstjhp 评论的回复中可以看出,您能否将 JS 条件调整为上面的 OP?我试过condition = "input.dlist in displayList[0]"
  • 我不明白。你想要这个主面板,不是吗?
  • 是的,我只是想找出正确的 JS 条件语句。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-09-20
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2021-11-15
相关资源
最近更新 更多