R командная строка, передающая имя файла сценарию в аргументах (Windows) - PullRequest
9 голосов
/ 26 января 2011

Мне трудно передать имя файла моему скрипту 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]) и т. Д., Но не повезло. Большая часть документации, которую я видел, не относится конкретно к передаче имен файлов. Кто-нибудь может придумать решение?

Ответы [ 4 ]

17 голосов
/ 26 января 2011

Как я уже сказал в своем комментарии, я бы использовал 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
7 голосов
/ 26 января 2011

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

6 голосов
/ 26 января 2011

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

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

Вы также усложняете ситуацию передачей 'fn = foo.csv'. Просто передайте имя файла и назначьте его в вашем скрипте. Если вы действительно хотите использовать 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

Где batch.csv - простой CSV-файл.

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

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

2 голосов
/ 07 января 2013

1001 * попробовать *

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