【问题标题】:Why does observeEvent don't re-evaluate it's content?为什么observeEvent 不重新评估它的内容?
【发布时间】:2018-01-11 09:31:47
【问题描述】:

在以下示例中,文本未显示在开头。如果我单击“显示”按钮,则会出现文本。如果我然后单击“隐藏”按钮,则不会再发生其他任何事情。 事实上,“textis$visible”变量总是有正确的值,但我认为observeEvent funktion中的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)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    observeEvent 表达式在其事件表达式的值发生变化时进行评估。但是,在上面的代码中,当textis$visible 更改时,如果textis$visible 为真,观察者只有执行指令。在下面的代码 sn-p 中,我使用了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 将消失。

    【讨论】:

    • 这种解决了我的问题。但是在实际应用程序中,我想阻止 server.R 执行它的一部分代码,并且如果某个值变为 false,则不显示已执行的内容。这就像一个注销功能,其他计算机用户看不到您计算的内容。有没有办法重新启动 R 会话?
    • 对于闪亮的应用程序的重置,我找到了一个很好的答案:stackoverflow.com/questions/25062422/restart-shiny-session
    【解决方案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)
    

    【讨论】:

      【解决方案3】:

      试试这样的:

      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)
      

      【讨论】:

        猜你喜欢
        • 2012-06-12
        • 1970-01-01
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        • 2018-12-07
        • 2014-05-19
        • 2019-05-24
        相关资源
        最近更新 更多