![](/img/trans.png)
[英]Shiny error: “/usr/bin/R: line 238: /usr/lib/R/etc/ldpaths: Permission denied”
[英]Makefile with SHELL=/usr/bin/R : handling multilines
我正在玩R和Gnu 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.