我正在开发一个R包。它基于仅使用Makefile的项目。其中大部分内容很容易转换为R CMD build
工作流程。然而,我需要创建的pdfs有点复杂,除非我修补,否则我不能正确使用它们 - 到目前为止,我想到了如何使用Makefile。
在R包文档中,我找到了对sources甚至for vignettes使用Makefile的参考。
我不知道应该如何应用这些。从这些文档中我得到的印象Makefiles将在R CMD build
的过程中被调用,但是当我将Makefile放在所描述的目录中时,它们将被忽略。但是R CMD check
识别它们并输出通过测试。
我也看到一些内部调用R CMD build
的Makefile - 但我一直想知道当我使用install.packages
时这些将如何执行。这看起来并不正确 - 我的意思是,如果它不关心,为什么会R CMD check
这些。还有page in R packages关于添加SystemRequiremens: GNU make
的问题 - 为什么这个文件对于您不使用的文件?
那么现在的最佳做法是什么?我可以看一下野外的例子吗?
更新
我被问到一个例子
我想像"Writing package vignettes"中描述的那样建立一个小插图。有一个主Latex文件,其中包含几个Rnw文件。 具体的困境是:
到目前为止,我使用Makefile执行此操作,一般模式如下:
tmp/test.pdf: tmp/test.tex tmp/rnw1.tex tmp/rnw2.tex
latexmk -outdir=$(@D) $<
tmp/%.tex: r/%.rnw
Rscript -e "knitr::knit('$<', output='$@')"
tmp/rnw1.tex tmp/rnw2.tex: tmp/slowdata.Rdata
tmp/slowdata.Rdata: r/ireallytakeforever.R
Rscript $<
答案 0 :(得分:6)
Bdecaf,
好的,回答版本2.0 - 轻笑。
你提到过&#34; 问题是Makefile和包构建工作流程应该如何结合在一起&#34;。在这种情况下,我建议您查看一组示例R包makefile:
knitr
包makefile
(在我看来)提供了一个如何构建小插图的好例子。您需要查看makefile
和目录结构,这将是我建议您查看和使用的模板。
我还建议您查看Karl Broman,一个用于R包开发的Makefile。最重要的是,我将从Makefiles for R/LaTeX projects指南开始 - (这是我自己用作源参考的一段时间,现在已经被Hadley关于软件包的书黯然失色,但仍然有用(在我看来)。
另一个建议是阅读Rob Hynman先前引用的文章
在他们之间,你应该能够按照你的要求做。除此之外,您还可以参考基础R包装手册。我希望以上有所帮助。
吨。
我认为,可重复研究最重要的工具不是knitr或GNU make,而是R。
例如,考虑与手稿相关的所有文件。在最简单的情况下,我会为每个数字添加一个LaTeX脚本,并为主文本添加一个BibTeX文件。然后是参考文件的GNU make文件。
编写最终PDF有点工作:
R个脚本需要在latex之前运行,并且只有在它们发生了变化时才会运行。
the following让这很容易。在您的手稿目录中,您创建一个名为Makefile的文本文件,其外观类似于pdflatex(此处使用On Windows, go here to download make.)。
mypaper.pdf: mypaper.bib mypaper.tex Figs/fig1.pdf Figs/fig2.pdf
pdflatex mypaper
bibtex mypaper
pdflatex mypaper
pdflatex mypaper
Figs/fig1.pdf: R/fig1.R
cd R;R CMD BATCH fig1.R
Figs/fig2.pdf: R/fig2.R
cd R;R CMD BATCH fig2.R
每批行指示要创建的文件(目标),它所依赖的文件(先决条件),然后是从依赖文件构造目标所需的一组命令。请注意,带有命令的行必须以标签字符开头(不是空格)。
另一个很棒的功能:在上面的示例中,当fig1.R发生变化时,你只需构建fig1.pdf。请注意,依赖关系会传播。如果你改变fig1.R,那么fig1.pdf将会改变,所以mypaper.pdf将被重建。
奇怪:如果您需要更改目录以运行命令,请在与相关命令相同的行上执行cd。以下方法无效:
### this doesn't work ###
Figs/fig1.pdf: R/fig1.R
cd R
R CMD BATCH fig1.R
You can, however, use \ for a continuation line, line so:
### this works ###
Figs/fig1.pdf: R/fig1.R
cd R;\
R CMD BATCH fig1.R
请注意,您仍然需要使用分号(;)。
您可能已在计算机上安装了GNU make。在终端/ shell中输入make --version来查看。 (make documentation)
使用make:
如上所述,您可以使用简单的make文件,指定目标文件,它们的依赖项以及创建它们的命令。但是你可以添加许多装饰,以节省一些打字。
以下是我使用的一些选项。 (有关详细信息,请参阅pattern rule。)
如果你要多次重复同一段代码,你可能想要定义一个变量。
例如,您可能希望使用标志--vanilla运行R.然后,您可以定义变量R_OPTS:
R_OPTS = - 香草 您将此变量称为$(R_OPTS)(或$ {R_OPTS};允许使用括号或花括号),因此在R命令中您将使用类似
的内容cd R; R CMD BATCH $(R_OPTS)fig1.R 这样做的一个优点是你只需要输入你想要的选项;如果你改变了想要使用的R选项的想法,你只需要在一个地方改变它们。
例如,我实际上喜欢使用以下内容:
R_OPTS = - no-save --no-restore --no-init-file --no-site-file 这就像--vanilla但没有--no-environ(我需要它,因为我使用.Renviron文件来定义R_LIBS,说我在另一个目录中定义了R包)。
您可以使用一堆自动变量来节省大量的输入。以下是我最常用的那些:
$@ the file name of the target
$< the name of the first prerequisite (i.e., dependency)
$^ the names of all prerequisites (i.e., dependencies)
$(@D) the directory part of the target
$(@F) the file part of the target
$(<D) the directory part of the first prerequisite (i.e., dependency)
$(<F) the file part of the first prerequisite (i.e., dependency)
例如,在我们的简单示例中,我们可以简化行
Figs/fig1.pdf: R/fig1.R
cd R;R CMD BATCH fig1.R
我们可以写
Figs/fig1.pdf: R/fig1.R
cd $(<D);R CMD BATCH $(<F)
在这种情况下,自动变量$(<D)
将获取第一个先决条件R的目录值。在这种情况下,$(<F)
将获取第一个先决条件fig1.R
的文件部分的值。
好的,这不是真正的简化。这似乎没有多大优势,除非该目录可能是一个令人讨厌的长字符串,我们想避免必须输入两次。主要优势在下一部分。
如果要以相同的方式构建多个文件,您可能需要使用look like。关键的想法是你可以使用符号%作为通配符,扩展为任何文本字符串。
例如,我们的两个数字基本上以相同的方式构建。我们可以通过包含一系列覆盖fig1.pdf和fig2.pdf的行来简化示例:
Figs/%.pdf: R/%.R
cd $(<D);R CMD BATCH $(<F)
这样可以节省输入并使文件更易于维护和扩展。如果要添加第三个数字,只需将其添加为mypaper.pdf的另一个依赖项(即先决条件)。
我们的例子,带有褶边
将所有这些添加到一起,这是我们的示例Makefile将GNU Make。
R_OPTS=--vanilla
mypaper.pdf: mypaper.bib mypaper.tex Figs/fig1.pdf Figs/fig2.pdf
pdflatex mypaper
bibtex mypaper
pdflatex mypaper
pdflatex mypaper
Figs/%.pdf: R/%.R
cd $(<D);R CMD BATCH $(R_OPTS) $(<F)
增加的装饰的优点:减少打字,并且更容易扩展以包括额外的数字。缺点:不太熟悉Makefile的其他人更难理解它正在做什么。
更复杂的例子
到处都有复杂的Makefile。捅github并研究它们。
以下是我自己的一些例子:
以下是Mike Bostock的一些例子:
另请查看Yihui Xie knitr的R maker个GNU make webpage包。{/ p>
同样令人感兴趣的是Official manual,一个用于R包开发的Makefile。
R包是分发R代码和文档的最佳方式, 尽管有官方手册的印象 (a book about R packages) 可能会给,他们真的很容易创建。
即使对于您不打算使用的代码,您也应该制作R套餐 分发。您会发现跟踪自己的内容会更容易 个人R功能,如果他们在一个包中。写作很好 文档,即使它只是为了你未来的自我。
Amazon写道 Hilary Parker(免费在线;也 以纸张形式提供 short and clear tutorial on writing R packages)。您 可能只是直接跳到那里。
Hadley's book写了一篇 Hilary's tutorial。 如果你想要一个速成课程,你应该从那里开始。很多人 已经从她的指示中成功构建了R包。
但是,拥有多样性是有价值的 资源,所以我想我会继续编写自己的最小教程。 以下主题列表看起来很禁止,但每个主题都很简短 直截了当(希望清楚)。如果你被列表推迟了 主题, 而且你还没有放弃我的支持 Why write an R package?,那你为什么不读书呢 The minimal R package?如果有人还在我身边,以下几页内容涵盖了我的要点 制作一个R包。
以下是重要但不重要的。
以下包含指向其他资源的链接:
如果这里的任何内容令人困惑(或错误!),或者我错过了 请重要的细节 on github,或(甚至 更好)fork tutorials, 进行修改,并提交拉取请求。
本教程的来源是git/github。
另请参阅我的GNU make knitr, making a web site with GitHub Pages, data organization, reproducible research, {{3}}, 和{{3}}。