我有一个脚本(称之为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中运行。
答案 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])