Makefile with SHELL = / usr / bin / R:处理多行

时间:2014-01-29 21:06:58

标签: r shell makefile

我正在玩 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

2 个答案:

答案 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")