【发布时间】:2017-02-14 06:11:06
【问题描述】:
我正在编写一个生成Makefiles 的R 包,我需要编写一个调用Rscript 的Makefile,然后再制作目标。问题的 MWE 如下。由于.INIT 的右侧未执行,因此错误退出。为file.rds 写食谱不符合我的需要。
a=1
.INIT=`Rscript -e 'saveRDS('$(a)', "file.rds")'`
all: file2.rds
file2.rds: file.rds
cp file.rds file2.rds
clean:
rm file.rds file2.rds
我能做些什么来修复这个Makefile 并保持它的便携性?在 R 扩展手册中,我无法使用 $(shell 来完成我想要完成的任务。
编辑
从@Spacedman 的第一个答案中,我了解到.INIT 是“扩展”/执行的,当且仅当它在某处用作变量时。太棒了! @Spacedman,我邀请您将以下 Makefile 复制到您自己的答案中,这样我就可以给您信用。
a=1
.INIT=`Rscript -e 'saveRDS('$(a)', "file.rds")'`
all: file2.rds
file2.rds:
echo "file.rds should not have been built."
file3.rds:
echo -n $(.INIT)
cp file.rds file3.rds
clean:
rm file.rds file2.rds
下面展示了我所希望的结果。
$ make file2.rds
echo "file.rds should not have been built."
file.rds should not have been built.
$ ls file.rds
ls: cannot access file.rds: No such file or directory
$ make file3.rds
echo -n `Rscript -e 'saveRDS('1', "file.rds")'`
cp file.rds file3.rds
$ ls file.rds
file.rds
【问题讨论】:
-
什么错误?您是否希望 Makefile 在将其视为 file2.rds 的依赖项之前通过 .INIT 创建
file.rds? -
是的,完全正确。我知道这很荒谬,但实际用例的不同足以让人说得通。
-
如果你不能使用
$(shell并且你不能使用食谱,我怀疑你已经吃饱了。我没有看到其他运行外部命令的方法。 -
便携是什么意思?是否需要与 BSD
make一起使用? -
BSD
make,dmake, etc. 这是一个R package,所以它需要遵循Writing R Extensions guidelines。
标签: r makefile rscript r-package