【问题标题】:How can a script find itself in R running from the command line?脚本如何在命令行运行的 R 中找到自己?
【发布时间】:2012-11-08 19:04:13
【问题描述】:

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

【问题讨论】:

  • 公平地说,我不确定,但看起来不像。我不得不说,我不擅长使用命令行。我已经编辑了我的帖子以添加我正在使用 Windows,我不知道它是否会对答案产生影响。阅读其他一些帖子,我得到了印象#!在 Windows 中不起作用。

标签: r shell command-line


【解决方案1】:

下面是一个解决方案,当脚本使用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 - 但运行 Rscript 并带有额外选项,例如 --vanilla--file=[...] 可能会在任何地方结束。使用类似grep 的函数来查找它比使用像4 这样的硬编码位置更明智。
  • 感谢您对此的关注。为简洁起见将其省略。
  • @mplourde 谢谢!我不知道normalizePath。我喜欢你在tryCatch 那里得到了一切。
【解决方案2】:

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

我假设你用 RScript 调用它。

Rscript Main.R 'path' 

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

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

【讨论】:

    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2015-02-04
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多