仅在 R Markdown 中渲染块输出的最后 X 行

only rendering last X lines of chunk output in R Markdown

我像这样从 R Markdown 调用 shell 程序

```{sh}
SomeShellProgram -options
```

并将文件呈现为 HTML。程序的计算确实需要一些时间,因此作者包含了一个自我更新的进度"bar",看起来像这样:

45Mb 12.4% 935 OTUs, 3485 chimeras (6.7%)

但是,尤其是进度慢的时候,每0.1%左右就会更新这一行。并且每一行在HTML中单独渲染,最多可以添加1000行进度条。

我不想完全抑制输出,例如在块选项中使用 echo=FALSE。我正在制作一份报告,打印的信息很重要。

我正在寻找一种 hack,它会以某种方式只捕获最后的 X 行并呈现这些行,或者可能使用 grep 或类似的东西来只捕获具有 100% 左右的行。

我尝试使用 > output.txt 重定向输出,但是进度没有打印到文件中(尽管有其他信息)。

如果不给出完整示例,我想不出一种方法来提供可重现的示例,对此深表歉意。

对于那些感兴趣的人:我正在尝试生成一份关于 16S Illumina 测序数据分析的报告,我正在使用 Usearch,最让我头疼的命令是 usearch -cluster_otus 命令。

更新

渲染最后 X 行还有一个问题:输出中的进度条由 ^M(回车 return 个字符)分隔,而不是换行符,因此 less仅将其识别为单行。因此我的最终解决方案包括

  1. 使用 2> 将进度条的输出重定向到一个文件中
  2. 使用 sed
  3. ^M 个字符替换为换行符
  4. 使用 less
  5. 渲染最后 X 行

我在 mac osx 上执行此操作的(伪)代码如下(其中 X = 行数)

FunctionWithProgressBar -option 2> tempfile.tmp
sed -ibak $'s/\x0D/\\n/g' tempfile.tmp
tail -nX tempfile.tmp

在R Markdown中:

```{sh, results="hide"}
FunctionWithProgressBar -option 2> tempfile.tmp
```
```{sh, echo=FALSE}
sed -ibak $'s/\x0D/\\n/g' tempfile.tmp
tail -nX tempfile.tmp
```

请注意,匹配退格键是一件令人头疼的事情(尤其是在 osx 上)并且平台之间会发生变化。

进度条可能在 sterr 流中,所以您使用“2>”而不是“>”捕获它,这样您就可以分别捕获 stderr 和 stdout,例如:

usearch blablabla 2> only_err > only_stdout

或者如果你想把所有的输出放在一起,你必须将 stderr 重定向到 stdout,然后做一个追加,像这样:

usearch blablabla >> total_output 2>&1

关于R-markdown部分,实在帮不上忙,没用过,sorry

问候,

莫里茨