2012-11-20 21 views
6

我有一個腳本(稱之爲Main.R),有下面的代碼來發現自己,當我運行它:腳本如何在命令行運行的R中找到自己?

frame_files <- lapply(sys.frames(), function(x) x$ofile) 
frame_files <- Filter(Negate(is.null), frame_files) 
main.dir <- dirname(dirname(frame_files[[length(frame_files)]])) 

這是用來獲取高於其自己的目錄,main.dir,這是用來調用該目錄其他腳本相對於此路徑。

我感興趣的是運行在命令行這個腳本,例如

R CMD BATCH Main.R 

Rscript Main.R 

不幸的是,上面的命令不會當我打電話的腳本命令工作線。

是否有任何代碼可以放入Main.R或撥打電話選項RRscript我可以改用它嗎?

更具體地說,該解決方案需要在Windows中工作。

+0

這有幫助嗎? http://stackoverflow.com/questions/750786/whats-the-best-way-to-use-r-scripts-on-the-command-line – atomh33ls

+0

爲了公平起見,我不確定,但它沒有'看起來像。我必須說,我不擅長使用命令行。我編輯了我的帖子,添加了我正在使用的Windows,我不知道它是否在答案中有所不同。讀一些其他的帖子,我得到的印象#!在Windows中不起作用。 – J4y

回答

8

下面是一個解決方案時,腳本或者與source或運行會給你正確的文件目錄路徑RSCRIPT。

# this is wrapped in a tryCatch. The first expression works when source executes, the 
# second expression works when R CMD does it. 
full.fpath <- tryCatch(normalizePath(parent.frame(2)$ofile), # works when using source 
       error=function(e) # works when using R CMD 
        normalizePath(unlist(strsplit(commandArgs()[grep('^--file=', commandArgs())], '='))[2])) 
dirname(full.fpath) 

關鍵是功能normalizePath。給定相對路徑或縮寫路徑名稱,normalizePath將返回有效路徑或引發錯誤。從Rscript運行腳本時,如果您給當前腳本的基本文件名normalizePath,它將返回完整路徑,而不管當前目錄是什麼。當你提供一個到R CMD的相對路徑並且當前目錄中有一個同名的腳本時,它甚至可以獲得正確的路徑!

在上面的代碼中,我從commandArgs返回的一個字符串中提取文件名。如果你看看commandArgs的輸出,你會發現文件名是第四個參數。參數記錄爲'--file = yourscript.R',因此在上面的最後一行中,我將字符串拆分爲'='並提取文件名。

+1

+1 - 但運行具有額外選項的'Rscript',如'--vanilla'和'--file = [...]'可能會在任何地方結束。使用類似grep的函數來找到它比使用像'4'這樣的硬編碼位置更明智。 – flodel

+0

感謝您對此的關注。爲了簡潔起見,將其留出。 –

+0

@mplourde謝謝!我不知道'normalizePath'。我喜歡你用'tryCatch'把它全部放在那裏。 – J4y

1

在想法是給你的Main.R

路徑作爲參數,我想你與RSCRIPT調用它。

Rscript Main.R 'path' 
在Main.R

您添加的代碼讀取參數

args <- commandArgs(trailingOnly = TRUE) 
mainpath <- as.character(args[1])