在以下示例中,文本未显示在开头。如果我单击“显示”按钮,则会出现文本。如果我然后单击“隐藏”按钮,则不会再发生任何其他事情。
事实上,“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/

10-12 17:45