gpt4 book ai didi

r - 在 Shiny 的应用程序中的观察者循环内更新图

转载 作者:行者123 更新时间:2023-12-04 03:51:56 25 4
gpt4 key购买 nike

我已经用R编写了一个模拟,现在我想用 Shiny 的图像进行可视化。我已将仿真的主要部分放入观察块中以便进行评估。在此评估过程中,即,对于每次迭代,我都希望绘制当前状态。问题是我该如何实现这一目标,因为在我的实际代码中,绘图的绘制只是在评估了主要观察者之后执行的。例如,是否有一种方法可以挂起observe块的执行并在绘图更新后继续执行?

难道不应该有更多的功能可以解决这种情况,因为我可以想象我不是唯一愿意做这样的事情的人吗?

如果您可以帮助我,那将是一件好事:)

下面是服务器和ui的一些框架代码。

ui.R:

library(shiny)

shinyUI(pageWithSidebar(

headerPanel("... Simulation"),

sidebarPanel(
sliderInput("epochs",
"Number of Epochs:",
min = 1,
max = 100,
value = 10),
verbatimTextOutput("curr.iter"),
actionButton("actionB", "Action!")
),

mainPanel(
plotOutput("distPlot")
)
))

server.R:
library(shiny)

sinus <- data.frame()

shinyServer(function(input, output) {

dummy <- reactiveValues(iter=0)

obsMain <- observe({
for (i in 1:input$epochs) {
cat(i, " ")
x <- seq(1:input$epochs)
y <- sin(x)
sinus <<- data.frame(x, y)
dummy$iter <- i
#
# At this time I want distPlot & curr.iter to be evaluated/updated!
#
Sys.sleep(1)

}

}, suspended=TRUE)


obsAction <- observe({ if(input$actionB > 0) obsMain$resume() }) # Helps to avoid initial evaluation of obsMain...

output$curr.iter <- renderText({ as.numeric(dummy$iter) })

output$distPlot <- renderPlot({ if (dummy$iter > 1) plot(sinus, type="l") })

})

最佳答案

我对此做了更多的思考。我认为正确的解决方案是使用invalidateLater安排工作在小块中进行,但允许其他 react 性依赖项中断我们长期运行的过程,以执行诸如更新图形之类的事情。

我在https://gist.github.com/trestletech/8608815整理了一个简单的例子。您可以使用

runGist(8608815)

基本前提是我们正在进行一些长时间运行的迭代计算,就像在仿真中所做的一样,但是我们以较小的块进行计算,以允许其他响应式(Reactive)在两者之间运行。我的代码很容易执行,因此我可以在大约1秒钟内处理100,000次循环迭代,这大约是我愿意等待我的应用程序进行交互式更新的时间。我想进行500万次迭代,所以我计划要发生50个块。

每次运行100,000次迭代时,我都会更新几个响应值,这些响应值会生成其他一些更新,最终以 renderText的形式发送到我的UI(尽管像您这样的 renderPlot可以完全一样)。如果您运行该应用程序,则会看到在我运行的每个块之间更新了这些响应式(Reactive)内容,然后计划安排下一个块运行。

此方法有一些开销,因此您的计算可能会稍微减慢。但是在我的机器上,一次在控制台上运行500万次迭代花费了21秒,而在这种延迟调度模型中花费了23秒。当然,您可以通过做更大的块将其进一步降低。

让我知道你的想法。我认为将其包装起来并在Shiny中包含它的一部分或作为扩展包可能是有意义的。

关于r - 在 Shiny 的应用程序中的观察者循环内更新图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282228/

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