我正在尝试构建一个 Shiny 的应用程序,通过不同的 render* 函数输出多个结果。
问题是这些结果之一需要一些时间来计算。所以我希望shiny尽快呈现快速的结果。
这是一些代码来说明
# ui.R
library(shiny)
shinyUI(fluidPage(
textOutput("res1"),
textOutput('res2')
))
# server.R
library(shiny)
shinyServer(function(input, output) {
output$res1 = renderText({
"shows up instantly"
})
output$res2 = renderText({
Sys.sleep(3)
"shows up after 3 sec"
})
})
目前,网页保持空白 3 秒,两个元素同时呈现。
我的问题是以下一个:是否可以强制执行
output$res1
在 output$res2
之前执行并且在长计算开始之前将结果发送到浏览器?
最佳答案
退房 invalidateLater否则,如果您只想渲染文本,您可以使用以下命令直接向客户端发送文本:
# ui.R
library(shiny)
ui <- shinyUI(fluidPage(
tags$head(
tags$script(
HTML("
Shiny.addCustomMessageHandler ('print',function (message) {
$('#'+message.selector).html(message.html);
console.log(message);
});
")
)
),
textOutput("res1"),
textOutput('res2')
))
# server.R
server <- shinyServer(function(input, output, session) {
session$sendCustomMessage(type = 'print', message = list(selector = 'res1', html = "shows up instantly"))
Sys.sleep(3)
session$sendCustomMessage(type = 'print', message = list(selector = 'res2', html = "shows up after 3 sec"))
})
shinyApp(ui = ui, server = server)
关于r - 强制渲染已经计算的 react 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241733/