Rmarkdown中的插入符号doparallel:使用render()时缺少详细信息

Posted

技术标签:

【中文标题】Rmarkdown中的插入符号doparallel:使用render()时缺少详细信息【英文标题】:Caret doparallel in Rmarkdown: Missing verbose info when using render() 【发布时间】:2020-02-26 15:48:56 【问题描述】:

我有以下简单的例子Rmarkdown文档(test.Rmd):

---
title: "Test Knit Caret Paralell VerboseIter"
output: html_document
---

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

require(caret)
require(doParallel)


```

## data

```r data

set.seed(998)
training <- twoClassSim()

```

## model

```r fitmodel
fitControl <- trainControl(
  method = "repeatedcv",
  number = 3,
  repeats = 2,
  verboseIter = T)


ncores <- detectCores()-1

cl <<- makePSOCKcluster(ncores, verbose = TRUE, outfile = "")
registerDoParallel(cl)

set.seed(825)
Fit <- train(Class ~ ., 
             data = training, 
             method = "nnet", 
             trControl = fitControl,
             trace = FALSE
)
stopCluster(cl)
registerDoSEQ()
```

## results

```r results
Fit
```

我有几个选项来运行此代码或编织文档

    在 Rstudio 中使用“运行所有块” 在 Rstudio 中使用 Knit 按钮 Knit 带有render("test.Rmd") 的文档

会发生以下情况

    在迭代时不会在输出或控制台中打印任何信息 信息打印在R markdown 面板中 控制台中不会打印任何信息

在我从事的项目中,我想knit 具有不同参数的文档,所以我想使用最后一个选项。不过我也想看看拟合模型的进展。因此,我想使用选项 3。

当文档被渲染时,如何获取在控制台打印的迭代信息?

这是我希望看到的预期输出:

+ Fold1.Rep1: size=1, decay=0e+00 
+ Fold1.Rep1: size=3, decay=0e+00 
+ Fold1.Rep1: size=5, decay=0e+00 
- Fold1.Rep1: size=1, decay=0e+00 
+ Fold1.Rep1: size=1, decay=1e-01 
- Fold1.Rep1: size=3, decay=0e+00 
+ Fold1.Rep1: size=3, decay=1e-01 
- Fold1.Rep1: size=5, decay=0e+00 
+ Fold1.Rep1: size=5, decay=1e-01 
- Fold1.Rep1: size=1, decay=1e-01 
+ Fold1.Rep1: size=1, decay=1e-04 
- Fold1.Rep1: size=3, decay=1e-01 
+ Fold1.Rep1: size=3, decay=1e-04 
- Fold1.Rep1: size=1, decay=1e-04 
etc.

【问题讨论】:

【参考方案1】:

这可能会产生您正在寻找的内容,改编自 here,当您使用 rstudio 中的 knit 按钮时,它基本上会复制,它会从 train 产生详细信息,但是使用此方法您应该能够将parameters 传递给render。只需将路径更改为rmd 文件的wd 即可

owd = setwd("path/to/your-Rmd-directory")
system2("Rscript", c("-e", shQuote("library(rmarkdown); render('test.Rmd')"),
            system2("html", "test.html"),
            setwd(owd)))

【讨论】:

它有效。但是有什么方法可以阻止进程吗?当我在 Rstudio 中停止时,该过程似乎在后台继续。 @Wietze314 在 Rstudio 中使用 stopEsc 键对我有用。你也可以设置一个timeout 我在 Rstudio 中使用了stop,它看起来好像停止了。但是当我查看任务管理器时,所有内核仍在 100% 运行。只有当我在任务管理器中手动关闭所有 R 会话时,它才会真正停止。【参考方案2】:

您可以在 Rmd 文件的顶部添加 knit_hook 以捕获控制台输出并在渲染时打印它们。

```r, include=FALSE
print_output <- function(x, options) 
  cat(x)
  return(x)

knitr::knit_hooks$set(chunk = print_output)
```

【讨论】:

感谢您的回复。我尝试了您的解决方案,但它确实有效,但用于降价文件的输出仅打印到控制台。我如何确保用于降价的输出也打印在输出文件中。 @Wietze314 已编辑。如果函数返回输入,它也将打印在编织文件中。 output 需要更改为chunk 以使字体一致。见yihui.name/knitr/hooks。 我还注意到,只有在chunk 代码完全执行时才会打印输出。所以学习过程中的进度没有打印出来,我想跟踪。

以上是关于Rmarkdown中的插入符号doparallel:使用render()时缺少详细信息的主要内容,如果未能解决你的问题,请参考以下文章

如果使用 doParallel 和 recipes 则出现插入错误

提高插入符号 (R) 中的模型训练速度

插入符号上的 parRF 不能用于多个核心

使用插入符号的完全可重现的并行模型

闪亮应用程序中的 RMarkdown

DiagrammeR 和 MathJax 无法正确呈现 rmarkdown 文档中的图形