簡體   English   中英

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

[英]Makefile with SHELL=/usr/bin/R : handling multilines

我正在玩RGnu Make (4.0,下面的代碼不適用於<= 3.81)我想使用R而不是經典的shell:

我寫了以下代碼:

.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工作正常但不是目標“ all ”,因為有多行:

$ /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

與';'

all: chr1_gold.txt.gz
    gold <- read.delim(gzfile("$<")) ;
    head(gold)

gold < - 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

在我看來,這是R的-e選項的一個問題:看起來與shell的-e選項不同,R的版本只接受一個命令並忽略嵌入的換行符(如您所懷疑的)。 不幸的是,在GNU make中沒有選擇讓它自動寫一個臨時文件並將其發送到SHELL。 這里的物流有點令人生畏:你如何在shell命令中指定文件的名稱? 或者如果你想通過stdin管道怎么辦? 等等。可以肯定,但需要仔細考慮設計。

目前GNU make要求SHELL使用的解釋器必須能夠接受命令行上提供的多行腳本,就像它一樣。

使用R我能想到的最直接的方法是使用define / enddef將配方放入變量中以保留換行符,然后使用新的$(file ...)函數將其寫入文件並調用R與該文件的名稱。 您可以使用用戶定義的變量使其更加清晰,但您可能不得不回到使用/ bin / sh作為SHELL。

我認為,一個替代方法是使用“ 利特勒

例如:

.PHONY: all
SHELL = /usr/bin/r
.SHELLFLAGS= -e
.ONESHELL:
.SILENT: all

all:
    x <- rnorm(10)
    cat(sd(x), "\n")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM