gpt4 book ai didi

r - 将 system() 输出流式传输到 Shiny 前端(连续)

转载 作者:行者123 更新时间:2023-12-03 16:24:44 24 4
gpt4 key购买 nike

如何捕获正在进行的输出 system() operation并“实时”将其流式传输到 Shiny 前端?
intern=T在字符向量中捕获整个输出,但我更喜欢“听”系统输出。

library(shiny) 
ui <- fluidPage(
titlePanel("Stream the system output"),
sidebarLayout(
sidebarPanel(
actionButton("btn1",label = "Let's stream")
),
mainPanel(
textOutput("textstream_output")
)
)
)
server <- function(input, output, session) {
rv <- reactiveValues("textstream"=c(""))
output$textstream_output <- renderText({
rv$textstream
})
observeEvent(input$btn1,{
# problem: is evaluated after finish, not during operation
rv$textstream <- system("Rscript -e \"for(i in 1:5){ print(Sys.time()); Sys.sleep(1); };\"",
intern = T)
})
}
shinyApp(ui = ui, server = server)

运行 system 时命令与 intern=F ,R 控制台每秒持续更新一次。我怎样才能在 Shiny 中建立它,理想情况下不必切片 system调用成更小的块?

enter image description here

可能相关:
  • Possible to show console messages (written with `message`) in a shiny ui?
  • Extend time progress bar displays message
  • R Shiny: mirror R console outputs to Shiny
  • 最佳答案

    reactiveTimer提供一种方法。我的猜测是您的方法不起作用,因为 observeEvent仅在表达式的评估完成后更新 react 对象。这是我的方法。我创建了一个要在后台运行的脚本,so_script.R ,并将输出转移到 so_output.txt .我们希望看到so_output.txt的内容在脚本运行时。

    cat('sink(file = "so_output.txt")
    for (i in 1:10) {
    cat(format(Sys.time(), format = "%H:%M:%S"), "\n")
    Sys.sleep(1)
    }
    cat("*** EOF ***\n")
    sink()
    ', file = "so_script.R")

    这是 Shiny 的应用程序:
    library(shiny) 
    ui <- fluidPage(
    titlePanel("Stream the system output"),
    sidebarLayout(
    sidebarPanel(
    actionButton("btn_start",label = "Let's stream"),
    actionButton("btn_stop",label = "Stop")
    ),
    mainPanel(
    htmlOutput("textstream_output")
    )
    )
    )
    server <- function(input, output, session) {
    rv <- reactiveValues(textstream = c(""),
    timer = reactiveTimer(1000),
    started = FALSE)
    observeEvent(input$btn_start, {
    rv$started <- TRUE
    system2("Rscript", "so_script.R", wait = FALSE)
    })
    observeEvent(input$btn_stop, { rv$started <- FALSE })
    observe({
    rv$timer()
    if (isolate(rv$started))
    rv$textstream <- paste(readLines("so_output.txt"), collapse = "<br/>")
    })
    output$textstream_output <- renderUI({
    HTML(rv$textstream)
    })
    }
    shinyApp(ui = ui, server = server)

    每次定时器触发时,我们都会读入 so_output.txt 的内容如果流媒体已经开始。输出:

    enter image description here

    关于r - 将 system() 输出流式传输到 Shiny 前端(连续),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50650616/

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