gpt4 book ai didi

r - Makefile with SHELL=/usr/bin/R : handling multilines

转载 作者:行者123 更新时间:2023-12-02 01:53:41 25 4
gpt4 key购买 nike

我正在玩 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 字符串)吗?

编辑:

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)

. 黄金 <- read.delim(gzfile("chr1_gold.txt.gz")) ; 头(金) ARGUMENT 'head(gold)' 已忽略

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

关于r - Makefile with SHELL=/usr/bin/R : handling multilines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21442674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com