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