gpt4 book ai didi

r - 在更新几个 react 性依赖项后控制执行流程

转载 作者:行者123 更新时间:2023-12-04 15:43:46 25 4
gpt4 key购买 nike

这是一个简单但高级的问题。这是一个演练:

我有三个输入 i_1、i_2、i_3,它们导致三个用于不同功能的 react 值:

I1 <- reactive({input$i_1})
I2 <- reactive({input$i_2})
I3 <- reactive({input$i_3})

具体来说,这三个值用于绘制图表作为 react 端点:
output$plot <- renderPlot {(
plot( f(I1(), I2(), I3()) )
)}

Shiny 的魔法奏效了,一切正常,直到我想加载一些数据并修改三个 i_X 值:
observe {(
input$b_Load #Load button
[...]
updateSelectInput(session,"i_1", value = 4)
updateSelectInput(session,"i_2", value = 3)
updateSelectInput(session,"i_3", value = 5)
...
)}

更新本身工作正常,变量的三个新值被发送到客户端。

问题:然后更新这些值并将其一一发送回服务器,服务器每次都不必要地重新计算图形。当所有值都更新时,我只想更新图表一次。是否可以?

我试过 等待 onFlushed 事件:
  values <- reactiveValues(loadingProfile = FALSE)

session$onFlushed(function() {
values$loadingProfile <- FALSE
cat("##### DEBUG: loading Profile OFF ##############\n", file = stderr())
}, once = FALSE)

output$plot <- renderPlot {(
if (!values$loadingProfile) {
plot( f(I1(), I2(), I3()) )
}
)}

observe {(
input$b_Load #Load button
values$loadingProfile <- TRUE #Toggle on the watching value
cat("##### DEBUG: loading Profile ON ##############\n", file = stderr())
[...]
updateSelectInput(session,"i_1", value = 4)
updateSelectInput(session,"i_2", value = 3)
updateSelectInput(session,"i_3", value = 5)
...
)}

但它不起作用,因为每次将三个更新版本之一发送回服务器时都会刷新 session ......(我在激活跟踪后检查了控制台)

什么不能正常工作:
  • 计数事件 ,正如@jdharrison 所建议的,可能是一个很好的黑客,但在这里不起作用,因为如果加载的值是 updateSelectInput()和以前一样,值不发回。
  • 稍等 , 类似 invalidateLater(2000, session)有点工作(我试过了)但并不健壮。不可能指定一个时间来始终捕获不同的交换而不会超调从而暂停执行太长时间。
  • 最佳答案

    根据我对 Shiny 的当前状态的了解,这个问题本身并没有答案。尽管如此,使用真棒 reactive()表达式,我已经能够重构值的流并且只更新一次图形。事实上

    output$plot <- renderPlot {(
    plot( f(User()) )
    )}

    observe {(
    input$b_Load #Load button
    updateSelectInput(session,"i_1", value = 4)
    updateSelectInput(session,"i_2", value = 3)
    updateSelectInput(session,"i_3", value = 5)
    ...
    )}

    User <- reactive({
    object <- list()
    object$i1 <- I1()
    object$i2 <- I2()
    object$i3 <- I3()
    )}

    + 对 f() 的小改写.

    在这里, User()响应式(Reactive)表达起到缓冲的作用。在将自己的值发送到 f() 之前,它将等待所有先前的更改被推送。 .

    我在 Github 上分享了我完整的 Shiny 项目, 想要查询更多的信息。

    关于r - 在更新几个 react 性依赖项后控制执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27161772/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com