2017-08-03 41 views
2

在以下示例中,文本未在开始时显示。如果我点击“显示” - 按钮,文本出现。如果我然后点击“隐藏” - 按钮,没有其他事情发生了。 事实上,“textis $ visible”变量总是具有正确的值,但我认为observeEvent函数中的if语句只是在第一次单击按钮后计算的。为什么observeEvent不重新评估它的内容?

有没有办法强制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) 

回答

1

只要事件表达式的值发生更改,就会评估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将被点击隐藏按钮时消失。

+0

这种解决了我的问题。但是在真正的应用程序中,我想停止server.R执行它的代码的一部分,并且不显示已经执行的东西,如果某个值变为false。它就像一个注销功能,其他计算机用户不会看到您计算的内容。有没有办法重新启动R会话? –

+0

为重新设置闪亮的应用程序,我发现一个很好的答案: https://stackoverflow.com/questions/25062422/restart-shiny-session –

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) 
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)