6

我有一个脚本(调用它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或看涨期权,R或者Rscript我可以使用它来代替?

更具体地说,该解决方案需要在 Windows 中运行。

4

2 回答 2

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',所以在上面的最后一行中,我将字符串拆分为'='并拉出文件名。

于 2012-11-20T18:55:59.773 回答
1

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

我假设你用 RScript 调用它。

Rscript Main.R 'path' 

在您的 Main.R 中添加代码以读取参数

args <- commandArgs(trailingOnly = TRUE)
mainpath <- as.character(args[1])  
于 2012-11-20T18:48:17.087 回答