【问题标题】:Updating non-reactive values in R Shiny更新 R Shiny 中的非反应值
【发布时间】:2021-04-07 12:10:28
【问题描述】:

我有以下例子:

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)

【问题讨论】:

  • 为什么说&lt;&lt;- 可能有问题?我在您的应用中没有发现任何问题。
  • 有问题的意思是你打破了观察的范围,在我看来,我认为作为一般的编程共识,应该尽可能避免。该应用程序运行良好,我只是想如果在第一种情况下修改非反应性值或这种方法中的任何已知警告可能会导致任何特定问题。

标签: r shiny


【解决方案1】:

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

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

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

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

(在 ReactiveVal 的情况下为 x())

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

【讨论】:

  • 谢谢,我知道最直接的影响是缺乏反应性,我想知道这是否是其他 Shiny 程序员使用的常用方法,例如对我来说似乎更自然的第二种方法。
  • 是的,我个人也会一直使用 reactiveVal。一旦您开始扩展应用程序的反应性可能会变得很重要,并且保持变量非反应性没有明显的优点。
猜你喜欢
  • 2020-04-23
  • 2020-06-26
  • 2023-02-25
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多