【问题标题】:Makefile dependencies with Sweave使用 Sweave 的 Makefile 依赖项
【发布时间】:2012-03-06 23:57:09
【问题描述】:

我正在尝试用一个 makefile 编译一个 Sweave 文档,使用存储在另一个目录中的数据,由当前目录中的脚本组装。工作流程是这样的:

datamaker.R > /otherdirectory/data > .rnw > .tex > .pdf

我目前有一个类似于下面创建的makefile:

MASTER = foo.pdf
VPATH = /otherdirectory
all: $(MASTER)
    open $<

data: datamaker.R
    R CMD BATCH 'datamaker.R'

foo.rnw: data

foo.tex: foo.rnw
    R CMD SWEAVE 'foo.rnw'

foo.pdf: foo.tex
    pdflatex foo.tex

问题在于 R CMD BATCH 命令每次都会运行,即使“datamaker”比“data”更早。我确定我遗漏了一些相当明显的东西,但我已经把头发拔了好几个小时了。

【问题讨论】:

  • 猜测:R CMD BATCH 命令实际上在otherdirectory/ 中生成data,而不是在当前目录中,对吗?

标签: makefile sweave


【解决方案1】:

Make 正在尝试使用data 规则来构建data,这是foo.rnw 的先决条件,但data 规则实际上并没有构建data,它构建了otherdirectory/data。所以 Make 每次都会运行它,因为 data 永远不存在。

试试这个:

...

otherdirectory/data: datamaker.R
    R CMD BATCH 'datamaker.R'

foo.rnw: otherdirectory/data

...

【讨论】:

  • 我认为这是添加 VPATH 变量的目的。无论如何,专门调用路径并不能解决问题。
  • 您能否检查时间戳并确认 1) otherdirectory/data 存在,2) 它比 datamaker.R 更新,以及 3) otherdirectory/data 规则仍在执行中?我想确定一下,因为下一步非常复杂。
  • 时间戳是有效的,但我找到了解决这个问题的另一种方法。但是,如果您想提供下一步,我很想听听。
猜你喜欢
  • 2016-09-14
  • 2013-04-27
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多