为什么observeEvent不会重新评估它的内容?

时间:2017-08-03 16:32:46

标签: r shiny

在以下示例中,文本未显示在开头。如果我点击“显示” - 按钮,文本就会出现。如果我然后点击“隐藏” - 按钮,就不会再发生其他任何事情了。 事实上,“textis $ visible”变量始终是正确的值,但我认为observeEvent funktion中的if语句仅在第一次按下按钮后计算。

有没有办法强制observeEvent重新评估if语句?或者是否有其他方法可以阻止在服务器部分执行代码并重新启动它(在实际情况下,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)

3 个答案:

答案 0 :(得分:2)

每次事件表达式的值更改时,都会计算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将消失。

答案 1 :(得分:2)

将一个渲染元素放在观察者中是不太好的做法(并且没有必要)。此外,由于您只有一个reactiveValue,因此可以使用reactiveVal(),请参阅下面的示例。您可以使用text_visible()调用其值,并使用text_visible(new_value)更新。

工作示例:

library(shiny)

ui <- fluidPage(

  actionButton(inputId="show","show"),
  actionButton(inputId="hide","hide"), 
  textOutput(outputId = "some_text")
)


server <- function(input, output) {

  text_visible<-reactiveVal(TRUE)

  observeEvent(input$show,
               text_visible(TRUE))

  observeEvent(input$hide,
               text_visible(FALSE))

  output$some_text<-renderText({ 
    if(text_visible()) 
      return("this is some text")
    else
      return("")
  })
}

  shinyApp(ui = ui, server = server)

答案 2 :(得分:0)

尝试这样的事情:

library(shiny)

ui <- fluidPage(

  actionButton(inputId="show","show"),
  actionButton(inputId="hide","hide"),
  textOutput(outputId = "some_text")
)

server <- function(input, output) {

  textis <- reactiveVal(F)
  observeEvent(input$show,{textis(T)})

  observeEvent(input$hide,{textis(F)})

  result <- eventReactive(textis(),{
    if(!textis()){
      return()
    }
    "this is some text"
  })

  output$some_text<-renderText({result()}) 
}

shinyApp(ui = ui, server = server)