我有一个脚本(称之为 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 中运行。
最佳答案
下面是一个解决方案,当使用 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”,因此在上面的最后一行中,我将字符串拆分为“=”并拉出文件名。
关于r - 脚本如何在从命令行运行的 R 中找到自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13477852/