是否可以有一个闪亮的条件面板,其条件是全局变量?

问题描述 投票:0回答:2

我的目标是让 tabsetPanel 包装在条件面板中,其条件是全局变量为 false。

ui.R

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

全球.R

searchPage <- "true"

然后在 server.R 中,我多次为其分配新值,但都是这样的:

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

无论我做什么,我总是收到“未捕获的引用错误:searchPage 未定义”。我尝试将 global.R 更改为使用引号、不使用引号、使用 <- or <<-, making it this.searchPage, my.searchPage and numerous other things (of course always making server.R and ui.R match too), but haven't had much luck at all.

的多种不同组合
r shiny
2个回答
5
投票

正如对该问题帖子的评论中提到的,这是

shinyjs
toggle()
/
show()
/
hide()
函数的完美用例。每当您需要有条件地显示某些内容,而条件不是输入的简单 javascript 表达式时,可以轻松使用这些函数而不是
conditionalPanel()

为了使用这些功能,您需要有某种方法来指定要隐藏/显示的元素(在本例中为

mainPanel()
)。最简单的方法是将整个面板包裹在一个带有 id 的 div 中。因此,像
mainPanel(div(id = "mainpanel", ...))
一样定义面板,瞧,您的面板有一个 id,现在您可以在服务器代码中随时调用
shinyjs::show("mainpanel")
hide()


2
投票

您尝试做的事情实际上不可能像您尝试做的那样(服务器和客户端位于不同的环境中并且不共享变量)。您需要显式地将值从服务器传递到客户端,并且有不同的方法可以做到这一点。一种方法:

library(shiny)

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)  
}

shinyApp(ui, server)

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

© www.soinside.com 2019 - 2024. All rights reserved.