仅在 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
仅将其识别为单行。因此我的最终解决方案包括
- 使用
2>
将进度条的输出重定向到一个文件中
- 使用
sed
将 ^M
个字符替换为换行符
- 使用
less
渲染最后 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
问候,
莫里茨
我像这样从 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
仅将其识别为单行。因此我的最终解决方案包括
- 使用
2>
将进度条的输出重定向到一个文件中 - 使用
sed
将 - 使用
less
渲染最后 X 行
^M
个字符替换为换行符
我在 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
问候,
莫里茨