我正在玩 R 和 Gnu Make (4.0,下面的代码不适用于< = 3.81)并且我想使用R而不是经典的外壳:
我写了以下代码:
.PHONY: all clean
SHELL = /usr/bin/R
.SHELLFLAGS= --vanilla --no-readline --quiet -e
.ONESHELL:
UCSC=http://hgdownload.cse.ucsc.edu/goldenpath/hg17/database/
all: chr1_gold.txt.gz
gold <- read.delim(gzfile("$<"))
head(gold)
chr1_gold.txt.gz:
download.file("${UCSC}/$@","$@")
clean:
$(foreach F,chr1_gold.txt.gz,file.remove("$F");)
目标 chr1_gold.txt.gz 工作正常但不是目标“所有”,因为有多行:
$ /make-4.0/make
download.file("http://hgdownload.cse.ucsc.edu/goldenpath/hg17/database//chr1_gold.txt.gz","chr1_gold.txt.gz")
> download.file("http://hgdownload.cse.ucsc.edu/goldenpath/hg17/database//chr1_gold.txt.gz","chr1_gold.txt.gz")
trying URL 'http://hgdownload.cse.ucsc.edu/goldenpath/hg17/database//chr1_gold.txt.gz'
Content type 'application/x-gzip' length 45866 bytes (44 Kb)
opened URL
==================================================
downloaded 44 Kb
>
>
gold <- read.delim(gzfile("chr1_gold.txt.gz"))
head(gold)
ARGUMENT 'head(gold)' __ignored__
> gold <- read.delim(gzfile("chr1_gold.txt.gz"));\
Error: unexpected input in "\"
Execution halted
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 1
我试图添加一个反斜杠,一个半冒号,但这不起作用:我该如何解决这个问题?我可以告诉make将文件传递给SHELL而不是使用参数(-e string)吗?
修改:
与
all: chr1_gold.txt.gz
gold <- read.delim(gzfile("$<")) \
head(gold)
read.delim(gzfile("chr1_gold.txt.gz")) \
head(gold)
ARGUMENT 'head(gold)' __ignored__
> gold <- read.delim(gzfile("chr1_gold.txt.gz")) \
Error: unexpected input in "gold <- read.delim(gzfile("chr1_gold.txt.gz")) \"
Execution halted
with';'
all: chr1_gold.txt.gz
gold <- read.delim(gzfile("$<")) ;
head(gold)
。 gold&lt; - read.delim(gzfile(“chr1_gold.txt.gz”)); 头(金) ARGUMENT'头(金)'忽略
> gold <- read.delim(gzfile("chr1_gold.txt.gz")) ;
>
>
与'; \'
all: chr1_gold.txt.gz
gold <- read.delim(gzfile("$<")) ;\
head(gold)
ARGUMENT 'head(gold)' __ignored__
> gold <- read.delim(gzfile("chr1_gold.txt.gz")) ;\
Error: unexpected input in "\"
Execution halted
Makefile:9: recipe for target 'all' failed
答案 0 :(得分:2)
在我看来,这是R -e
选项的一个问题:看起来与shell的-e
选项不同,R的版本只接受一个命令并忽略嵌入的换行符(如您所怀疑的那样) )。不幸的是,在GNU make中没有选择让它自动写一个临时文件并将其发送到SHELL。这里的物流有点令人生畏:你如何在shell命令中指定文件的名称?或者如果你想通过stdin管道怎么办?等等。可以肯定这样做,但需要仔细考虑设计。
目前GNU make要求SHELL使用的解释器必须能够接受命令行提供的多行脚本,就像它一样。
我能想到的最直接的R合作方式是使用define
/ enddef
将配方放入变量中以保留换行符,然后使用新的$(file ...)
函数将其写入文件并使用该文件的名称调用R.您可以使用用户定义的变量使其更加清晰,但您可能不得不回到使用/ bin / sh作为SHELL。
答案 1 :(得分:0)
我认为一种替代方法是使用“ littler”
例如:
.PHONY: all
SHELL = /usr/bin/r
.SHELLFLAGS= -e
.ONESHELL:
.SILENT: all
all:
x <- rnorm(10)
cat(sd(x), "\n")