запуск сценария R из другого каталога

Вот пример с парой скриптов

test.R ==>
source("incl.R", chdir=TRUE)
print("test.R - main script")

incl.R ==>
print("incl.R - included")

Они оба находятся в одном каталоге. Когда я запускаю его из этого каталога с помощью Rscript --vanilla test.R, он работает нормально. Я хотел бы создать несколько подкаталогов (run1, run2, run3,...) и запустить мои исходные сценарии для разных значений параметров. Предположим, я cd run1 и затем пытаюсь запустить скрипт, я получаю

C:\Downloads\scripts\run1>Rscript --vanilla ..\test.R
Error in file(filename, "r", encoding = encoding) :
  cannot open the connection
Calls: source -> file
In addition: Warning message:
In file(filename, "r", encoding = encoding) :
  cannot open file 'incl.R': No such file or directory
Execution halted

Как заставить это работать?


person ironv    schedule 15.05.2015    source источник


Ответы (1)


Я не уверен, что правильно понимаю вашу проблему. Я предполагаю, что ваши сценарии test.R и incl.R находятся в одной и той же папке, а затем вы запускаете test.R с помощью Rscript из какой-то другой папки. test.R должен выяснить, где хранится test.R (и, следовательно, incl.R), а затем источник incl.R.

Хитрость в том, что вы должны указать полный путь к скрипту test.R в качестве аргумента для вашего вызова Rscript. Можно получить этот аргумент, используя commandArgs, а затем построить из него путь к incl.R:

args <- commandArgs(trailingOnly=FALSE)
file.arg <- grep("--file=",args,value=TRUE)
incl.path <- gsub("--file=(.*)test.R","\\1incl.R",file.arg)
source(incl.path,chdir=TRUE)

В вашем примере в вопросе вы вызываете скрипт Rscript --vanilla ..\test.R. args тогда будет вектором символов, который содержит элемент "--file=../test.R". С помощью grep я захватываю этот элемент, а затем использую gsub для получения от него пути "../incl.R". Затем этот путь можно использовать в source.

person Stibu    schedule 15.05.2015
comment
Спасибо за ваш ответ. Вы правильно поняли вопрос. Есть ли способ не жестко закодировать путь (../incl.R)? Можно ли программно получить путь для test.R, а затем добавить этот путь при поиске других сценариев? - person ironv; 16.05.2015
comment
Я переформулировал ответ так, чтобы путь больше не был жестко запрограммирован. - person Stibu; 16.05.2015