R командная строка, передающая имя файла скрипту в аргументах (Windows)

мне трудно передать имя файла в мой R-скрипт. Файл представляет собой csv-файл с параметрами пакета для нескольких запусков сценария. Я пытаюсь включить его здесь, чтобы пользователю не нужно было редактировать скрипт R, чтобы указать местоположение этого файла.

мой синтаксис командной строки Windows:

R CMD BATCH --slave "--args fn=batch.csv" myscript.r output.txt

самое близкое, что я получил, чтобы получить это в моем R-скрипте, это:

eval(parse(file=commandArgs()[8])))
batch_args = read.table(fn, sep=",")

я экспериментировал с commandArgs(trailingOnly=TRUE) и parse(text=commandArgs()[8]), etc. без удачи. Большая часть документации, которую я видел, не применяется специально к передаче имен файлов. Может ли кто-нибудь придумать решение?

4 ответов


как я сказал в своем комментарии, я бы использовал Rscript вместо R CMD BATCH:

Rscript myscript.R batch.csv

где myscript.R содержит:

args <- commandArgs(TRUE)
batch_args <- read.table(args[1], sep=",")
# loop over multiple runs

Помимо использования Rscript (как сказал Джош), вы также должны использовать пакеты CRAN getopt или optparse как они были написаны для этой цели.


что вы подразумеваете под 'не повезло'? Имя файла находится там, в функции commandArgs (), вам просто нужно выяснить, как его получить. Код и сообщения об ошибках удобны.

это не проблема, если единственным дополнительным аргументом является имя файла, вы знаете его позицию. Что вас смутит, так это когда вы начнете передавать более сложный аргумент.

вы также усложняете вещи с передачей ' fn=foo.КШМ'. Просто передайте имя файла и назначьте его fn в своем скрипте. Если вы действительно хотите использовать eval вам, вероятно, нужно процитировать свое имя файла, таким образом, myscript.R-это:

ca = commandArgs(trailingOnly=TRUE)
eval(parse(text=ca))
print(read.csv(fn))

и бегите так:

R  --slave "--args fn='batch.csv'" < myscript.r
     A B C
   1 1 2 3
   2 6 8 3

где партия.csv-это простой файл csv.

вы можете сделать цикл над " ca " в своем скрипте и оценить все. Это немного опасно, так как вы можете легко сломать базовую функциональность.

лично я бы зациклился на ca, искал пары name=value для известного набора имен и устанавливал их. В основном реализация getopt, но кто-то, вероятно, уже сделал это...


попробовать

fn="batch.csv"; R CMD BATCH --slave "--args $fn" myscript.r output.txt