我已經在R中編寫了一個模擬,我想用閃亮的形象進行可視化。爲了進行評估,我已將模擬的主要部分放入塊中,觀察塊。在評估過程中,即每次迭代我想繪製當前狀態。問題是如何實現這一點,因爲在我的實際代碼中,繪圖的繪製只是在主觀察者被評估之後執行。例如,是否有辦法暫停觀察塊的執行,並在繪圖更新後繼續執行?在閃亮的應用程序中的觀察者循環內的更新圖
不應該有更多的光澤功能來解決這種情況,因爲我可以想象我不是唯一一個想要做這樣的事情?!
這將是很好,如果你可以幫我這個:)
下面是服務器和用戶界面的一些骨架代碼。
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") })
})
感謝您的回答。我已經看到了反應計時器的可能性,但我只是把系統。sleep()命令,以便爲繪圖出現預留一些時間(例如,在RStudio中,我必須以相同的方式執行,否則繪圖不會顯示)。在我的模擬中,計算任務會產生必要的延遲。我只是想知道是否存在觸發繪圖渲染的可能性(無論何時都需要),因此可以保留模擬引擎的狀態,而不必重新構建模擬循環。 – user3220352
您可以隨時渲染繪圖。問題是R是單線程的。所以如果它忙於處理你的模擬,那麼它不會評估其他被動依賴。這並不是Shiny的一個深思熟慮的部分,但現在我認爲你需要安排「大型」處理(模擬)以小塊(1或幾個迭代)計劃每隔幾毫秒發生一次 - 這個想法是,CPU不是通過運行模擬100%佔用的,給它時間來評估其他反應性上下文(比如你的圖)。 –
我建議用反應計時器每秒調度一次。看到你可以得到體系結構的工作,然後從那裏修改或者使定時器下降到一個更小的間隔,或者每次定時器觸發時做多次迭代。 –