我的目标是将一个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匹配),但一点也不运气。
答案 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
)
}))
可能有更好的方法。希望这有帮助