什么是一个与RStudio的"Knit HTML"功能相当的命令行工具?

46

有没有类似于RStudio的Knit HTML的简洁命令行等效方式?给定一个.Rmd文件,你可以使用RStudio来用Knitr编织.html.docx.pdf文件。将这个过程完全转移到命令行上会很不错。到目前为止,我采取的方法是:

Rscript -e "library(knitr); knit('test.Rmd')"  # This creates test.md
pandoc test.md >> test.html
这个方法很好用,但生成的test.html没有像在RStudio中那样漂亮的外观。有没有建议如何最好地通过命令行编织.Rmd文件到.html,并获得漂亮的.html呢?
额外问题:哪种命令行解决方案对于.pdf或.docx格式最好?

1
请点击这里来查看RStudio在底层做了什么来生成他们"漂亮"的HTML输出。 - hrbrmstr
Rscript -e 'library(rmarkdown); rmarkdown::render("[path]/test.Rmd", "html_document")' - mikey
5个回答

73
rmarkdown::render("test.Rmd", "html_document")

22
太好了,这很有效!完整的命令行命令是:Rscript -e 'library(rmarkdown); rmarkdown::render("/path/to/test.Rmd", "html_document")' - elke
2
基于@elke的精彩评论,使用默认输出格式并删除库调用(与::冗余)的更短的shell命令为:Rscript -e "rmarkdown::render('test.Rmd')". - Paul Rougieux
当单击RStudio图标时,页面会打开(或在我的情况下是PDF)。是否可以在命令行中指定在编织后打开PDF? - ECII

13

我的简化版命令行脚本,类似于Tyler R.的:

在您的.profile或类似文件中添加:

function knit() {
    R -e "rmarkdown::render('$1')"
}

然后,在命令行中输入knit file.Rmd

编辑:有关良好的自动完成,请参见评论

我在Rmd标头中设置了输出格式:output: github_document或类似


这很简单高效。将Tab键补全限制为.Rmd文件也很有用,可以节省一些打字时间。 - VFreguglia
是的,期待未来的读者能够添加这个自动完成功能! - Paul
4
我使用bash,所以我将东西添加到了我的.bashrc文件中,而不是.profile文件。我添加了complete -f -X '!*.Rmd' knit。可以参考这个例子:https://github.com/Freguglia/dotfiles/blob/d0be8c1b4f68af0605bac438c31ec98792e4aa0f/.bashrc#L97 - VFreguglia

12

在采纳答案的基础上,我起草了一个名为“knitter”的bash脚本,将完成所有必需的操作,用户只需要输入:./knitter file.Rmd file.html./knitter file.Rmd file.pdf

以下是脚本内容:

#!/bin/sh

### Test usage; if incorrect, output correct usage and exit
if [ "$#" -gt 2  -o  "$#" -lt 2 ]; then
    echo "********************************************************************"
    echo "*                        Knitter version 1.0                       *"
    echo "********************************************************************"
    echo -e "The 'knitter' script converts Rmd files into HTML or PDFs. \n"
    echo -e "usage: knitter file.Rmd file.{pdf,html} \n"
    echo -e "Spaces in the filename or directory name may cause failure. \n"
    exit
fi
# Stem and extension of file
extension1=`echo $1 | cut -f2 -d.`
extension2=`echo $2 | cut -f2 -d.`

### Test if file exist
if [[ ! -r $1 ]]; then
    echo -e "\n File does not exist, or option mispecified \n"
    exit
fi

### Test file extension
if [[ $extension1 != Rmd ]]; then
    echo -e "\n Invalid input file, must be a Rmd-file \n"
    exit
fi

# Create temporary script
# Use user-defined 'TMPDIR' if possible; else, use /tmp
if [[ -n $TMPDIR ]]; then
    pathy=$TMPDIR
else
    pathy=/tmp
fi
# Tempfile for the script
tempscript=`mktemp $pathy/tempscript.XXXXXX` || exit 1

if [[ $extension2 == "pdf" ]]; then
    echo "library(rmarkdown); rmarkdown::render('"${1}"', 'pdf_document')" >> $tempscript
    Rscript $tempscript
fi
if [[ $extension2 == "html" ]]; then
    echo "library(rmarkdown); rmarkdown::render('"${1}"', 'html_document')" >> $tempscript
    Rscript $tempscript
fi

3
有脚本处理这个问题的想法很棒。不幸的是,你的脚本存在一些错误(例如第二个参数是必需的,但基本上被忽略了——只有文件扩展名被考虑;脚本需要bash,但是用!/bin/sh启动等)。因此,我创建了修正版。现在第二个参数指定输出格式。 - R Kiselev
谢谢你让我保持警觉! - Tyler R.
1
如果您使用@RKiselev的版本,则语法将是./knitter <input_file_with_extension> <output_file_extension_only>,例如./knitter input.Rmd pdf - Masoud Ghaderi

0
getwd()
setwd("C:Location of the RMD File")

# To make it in to PDF you can use the below code also
rmarkdown::render("Filname.Rmd")

# To make it in to PDF you can use the below code also
rmarkdown::render("Filename", "pdf_document")

我将以上内容输入到一个R脚本中,并从Python命令提示符触发它,解决了我的需求 :) 请注意:如果不起作用...请尝试安装LaTeX并重试...祝您好运 :)

0

从 Mac/Linux 终端,您可以运行:

R -e "rmarkdown::render('README.Rmd')"

(将README.Rmd替换为您想编织的任何文件)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接