【问题标题】:"Live updates" when training a machine learning model in r shiny在 r shiny 中训练机器学习模型时的“实时更新”
【发布时间】:2018-07-10 07:52:18
【问题描述】:

我目前正在开发一个基于 R markdown 和 shiny 的用户界面,以便为不精通 R 的其他用户轻松执行机器学习训练过程。这个训练过程是由围绕 R 包的自定义构建函数完成的 mxnet 并在“正常”R 脚本中运行时将状态更新(例如训练错误或使用 message() 函数加载的包直接发送到控制台)。但是,在 R markdown 中运行此应用程序时,浏览器不会打印任何内容。以下脚本显示了一个最小的可重现示例(将训练过程替换为简单的“虚拟”函数):

---
title: "Training of a Neural Network"
output: html_document
runtime: shiny
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r start_training, echo=F}
inputPanel(
  actionButton("button_start_training", "Start training")
)
```

```{r dummy_function, echo=F}
dummy_function <- function(){
  for(i in 1:5){
    message(paste0("Test: "),i)
    Sys.sleep(0.5)
  }
}
```

```{r actual_training, echo=F}
event_training = eventReactive(input$button_start_training,{

  dummy_function()

})

renderPrint({
          event_training()

          })
```

dummy_function() 的控制台输出不显示在浏览器中,而仅显示在控制台中。如果message()print() 替换,结果中会显示is,但仅在之后函数完成,而不是“live” .因为实际的训练过程需要几个小时,所以我想提供这些更新,因为它们会在控制台中发生。此外,将message() 替换为print() 可能会导致一些问题,因为在mxnet 培训过程中,培训错误之类的信息会作为消息而不是打印(如果我理解正确的话)返回。

所以,这归结为两个问题:

  1. 有没有办法让renderPrint() 一出现就打印输出?
  2. 有没有办法让renderPrint() 使用message() 生成的输出而不是print()

感谢您的帮助。

【问题讨论】:

    标签: r machine-learning shiny r-markdown mxnet


    【解决方案1】:

    一种解决方案是将withCallingHandlersshinyjs 包(https://github.com/daattali/shinyjs) 结合使用。使用它,您可以更改页面上元素的内部 HTML,该元素会立即显示。从一个空元素开始,可以在每次函数调用message时给该元素添加一个日志,如下:

    dummy_function <- function(){
      for(i in 1:5){
        message(paste0("Test: "),i)
        Sys.sleep(0.5)
      }
    
    runApp(shinyApp(
      ui = fluidPage(
        shinyjs::useShinyjs(),
        actionButton("button_start_training", "Start training"),
        textOutput("logs")
      ),
      server = function(input, output, session) {
        observeEvent(input$button_start_training, {
          withCallingHandlers({
            shinyjs::html("logs", "")
            dummy_function()
          },
            message = function(m) {
              shinyjs::html(id = "logs", html = m$message, add = TRUE)
          })
        })
      }
    ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 2019-05-16
      • 2018-07-12
      • 2019-05-06
      • 2023-03-25
      • 2017-09-21
      • 2020-11-10
      • 2020-12-03
      相关资源
      最近更新 更多