r - 脚本如何在从命令行运行的 R 中找到自己?

标签 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 中运行。

最佳答案

下面是一个解决方案,当使用 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/

相关文章:

r - ggplot轴标签中的下标字母

r - 根据周围的行值子集数据框

R:替换随机矩阵的 "off-diagonal"元素

linux - 使用 awk 和 sed 合并特定行

python - 当 Python 从命令行运行时导入 urllib.parse 失败

r - 如何使用 R lattice reshape 堆叠条形图的数据

linux - 如何在文件中搜索字符串?

shell - 在 shell 中不逐行比较 2 个文件

bash - 新 Bash session 的多个初始化文件

windows - 如何暂停足够长的时间以使 cmd.exe 退出?