脚本如何在命令行中运行R?

时间:2012-11-20 16:40:45

标签: r shell command-line

我有一个脚本(称之为Main.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中运行。

2 个答案:

答案 0 :(得分: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)

想法是将路径作为Main.R的参数

我假设您使用RScript调用它。

Rscript Main.R 'path' 
在你的Main.R中

添加代码以读取参数

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