是否有可能有一个条件是全局变量的Shiny ConditionalPanel?

时间:2016-07-27 21:44:44

标签: r shiny

我的目标是将一个tabsetPanel包装在conditionPanel中,其条件是全局变量为false。

ui.R

mainPanel(
 conditionalPanel("searchPage == \"false\"",
     tabsetPanel(
      tabPanel("Summary",htmlOutput("summary")),
      tabPanel("Description", htmlOutput("description"))
))),

global.R

searchPage <- "true"

然后在server.R中我给它分配了几个不同的新值,但都是这样的:

 observeEvent(input$openButton, 
           output$results <- renderUI({
             textOutput("")
             searchPage <- "false"
           }))

无论我做什么,我总是得到“Uncaught ReferenceError:searchPage未定义”。我已经尝试将global.R更改为使用引号的多种不同组合,而不是使用引号,使用&lt; - 或&lt;&lt; - ,将其作为this.searchPage,my.searchPage和许多其他内容(当然总是制作) server.R和ui.R匹配),但一点也不运气。

2 个答案:

答案 0 :(得分:3)

正如问题帖子的评论中所述,这是shinyjs toggle() / show() / hide()函数的完美用例。每当您需要有条件地显示条件不是输入的简单javascript表达式时,它很容易使用这些函数而不是conditionalPanel()

为了使用这些功能,您需要有一些方法来指定要隐藏/显示的元素(在本例中为mainPanel())。这样做的简单方法是将整个面板包装在带有id的div中。因此,将面板定义为mainPanel(div(id = "mainpanel", ...)),瞧,您的面板上有一个ID,现在您可以随时在服务器代码中调用shinyjs::show("mainpanel")hide()

答案 1 :(得分:1)

您尝试执行此操作的方式实际上并不可能(服务器和客户端位于不同的环境中,并且不共享变量)。您需要将值从服务器显式传递给客户端,并且有不同的方法来执行此操作。一种方式:

library(shiny)
runApp(list(ui = fluidPage(
  conditionalPanel(condition='output.bool',
                   HTML("Hello world")),
  actionButton("btn","Press me to toggle")
),
server = function(input, output, session) {
  value=TRUE
  output$bool <- eventReactive(input$btn,{
    value    
  })
  outputOptions(output,"bool",suspendWhenHidden=FALSE)

  observeEvent(input$btn,
               value <<- !value        
  )  

}))

可能有更好的方法。希望这有帮助