仅在R Markdown

时间:2015-11-19 15:20:51

标签: r shell r-markdown

我正在调用来自R Markdown的shell程序,就像这样

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

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

  

45Mb 12.4%935 OTU,3485嵌合体(6.7%)

但是,特别是如果进度缓慢,它将每0.1%左右更新一次。每行都在HTML中单独呈现,最多可以提供1000行进度条。

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

我正在寻找一种黑客,它会以某种方式捕获最后的X行并渲染它们,或者使用grep或类似的东西来捕获100%左右的行。

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

在没有给出完整示例的情况下,我想不出提供可重现的示例的方法,对不起。

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

更新

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

  1. 将带有2>的进度条的输出重定向到文件
  2. 使用^M
  3. 替换sed个换行符
  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上)和平台之间的变化。

1 个答案:

答案 0 :(得分:0)

进度条可能位于sterr流中,因此您可以使用" 2>"而不是">"所以你可以分别捕获stderr和stdout,例如:

usearch blablabla 2> only_err > only_stdout

或者如果你想把所有输出放在一起,你必须将stderr重定向到stdout,并做一个追加,如下:

usearch blablabla >> total_output 2>&1

对于R-markdown部分,我无法提供帮助,从未使用过,抱歉。

的问候,

Moritz的