繁体   English   中英

更新 R Shiny 中的非反应值

[英]Updating non-reactive values in R Shiny

我有以下示例:

library(shiny)

ui <- fluidPage(
  textOutput("out"),
  actionButton("plusX", "Increase X"),
  actionButton("redraw", "redraw")
)

server <- function(input, output, session) {
  x <- 0
  observeEvent(input$plusX, {x <<- x+1})
  output$out <- renderText({
    input$redraw
    x
  })
}

shinyApp(ui, server)

这是否被认为是 Shiny 中的反模式以这种方式修改非反应性变量? 避免本身可能有问题的超级分配。

我知道这可以做到,例如使用 reactiveVal 来存储 X,并隔离以获得类似的结果。 第二种方式似乎更清晰,这将是我通常的选择,但我想知道第一种方式是否有任何警告,或者有可能这样做。

library(shiny)

ui <- fluidPage(
  textOutput("out"),
  actionButton("plusX", "Increase X"),
  actionButton("redraw", "redraw")
)

server <- function(input, output, session) {
  x <- reactiveVal(0)
  observeEvent(input$plusX, {x(x()+1)})
  output$out <- renderText({
    input$redraw
    isolate(x())
  })
}

shinyApp(ui, server)

在此示例中,两个代码之间没有重要区别,因为您没有使用 ReactiveVal 的好处。

ReactiveVal 的好处是它具有反应性,因此可以与其他反应性元素交互。

例如,尝试在您的代码中添加一个依赖于 x 的表:

output$tab <- renderTable({data.frame(y = x)})

(x() 在 ReactiveVal 的情况下)

您将看到不同之处在于,在 ReactiveVal 的情况下,表会自动使用 plusX 更新,而在常规变量的情况下,它不会更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM