在以下示例中,文本未显示在开头。如果我单击“显示”按钮,则会出现文本。如果我然后单击“隐藏”按钮,则不会再发生任何其他事情。
事实上,“textis$visible”变量始终具有正确的值,但我认为observeEvent 功能中的if 语句仅在第一次单击按钮后计算。
有没有办法强制observeEvent 重新评估if 语句?或者是否有其他方法可以阻止 Shiny 在服务器部分执行代码并重新启动它(在实际情况下,if 语句中会有一大堆函数调用,而不仅仅是隐藏和显示一些文本)
library(shiny)
ui <- fluidPage(
actionButton(inputId="show","show"),
actionButton(inputId="hide","hide"),
textOutput(outputId = "some_text")
)
server <- function(input, output) {
textis<-reactiveValues(visible=FALSE)
observeEvent(input$show,
textis$visible<-TRUE)
observeEvent(input$hide,
textis$visible<-FALSE)
observeEvent(textis$visible , if(textis$visible){
output$some_text<-renderText({"this is some text"})
})}
shinyApp(ui = ui, server = server)
最佳答案
当其事件表达式的值发生变化时,observeEvent 表达式就会被评估。但是,在上面的代码中,当 textis$visible
更改时,观察者只有在 textis$visible
为真时才执行指令。在下面的代码片段中,我使用 else{...}
为观察者提供了当 testis$visible
不为真时要执行的操作。
observeEvent(textis$visible , if(textis$visible){
output$some_text<-renderText({"this is some text"})
} else {output$some_text<-renderText({''}) }
)}
因此,如果您将上面的 else 子句粘贴到您的应用程序中,则单击隐藏按钮时,输出 some_text 将消失。
关于r - 为什么observeEvent 不重新评估它的内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45489941/