2017-08-03 44 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)