获取R脚本的路径

nic*_*ico 62 r path

有没有办法以编程方式在脚本本身内找到R脚本的路径?

我问这个是因为我有几个脚本使用RGtk2并从.glade文件加载GUI.

在这些脚本中,我不得不setwd("path/to/the/script")在开头放置一条指令,否则将找不到.glade文件(位于同一目录中).

这很好,但如果我将脚本移动到另一个目录或另一台计算机,我必须更改路径.我知道,这不是什么大问题,但有一些东西会很好:

setwd(getScriptPath())

那么,是否存在类似的功能?

rak*_*nsi 37

这对我有用:

getSrcDirectory(function(x) {x})
Run Code Online (Sandbox Code Playgroud)

这在脚本中定义了一个匿名函数(什么都不做),然后确定该函数的源目录,即脚本所在的目录.

  • 这在Linux R 3.2.4上对我不起作用.输出为空白. (31认同)
  • 在 3.3.2 中对我有用。@biocyberman:你是从控制台调用这个吗?因为它确实在那里为我返回空白。如果来自脚本,您是否打印它?(同样,它在从 Rstudio 获取源时起作用,而在运行代码时则不起作用)。 (3认同)
  • 警告:如果在获取文件后工作目录发生更改并且旧工作目录包含该文件,则这不起作用。原因是在这种情况下返回的路径是“。” (即工作目录),如果工作目录更改,则不再正确。 (2认同)

Ric*_*ton 29

仅适用于RStudio:

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
Run Code Online (Sandbox Code Playgroud)

这在运行文件时有效.

  • @HillarySanders您是否安装了install.packages(“ rstudioapi”)`? (2认同)
  • 当使用“source”时,这不起作用,因为这仅返回光标所在文档的路径。 (2认同)

had*_*ley 25

使用 source("yourfile.R", chdir = T)

  • 这不是广泛适用的,尤其不是问题的标题 - 你不能在脚本本身内使用它 - 如果你知道路径(来源文件),你显然也可以设置路径. (27认同)
  • @hadley这就是我的工作.不幸的是,这个假设并不总是有效(当使用`source`时,它会)[esp.在交互式会话中](http://stackoverflow.com/questions/8835426/get-filename-and-path-of-sourced-file/8852960?noredirect=1#comment26247034_8852960),错误的工作目录对我来说是一个主要的麻烦与非技术同事分享.r,.rmd等,他们将打开我发送的.r脚本,并在执行所有行时设置之前的WD,以便相对路径失败.所以,像PHP中的`__DIR__`这样的东西会很有用,但是,哈哈,如果可能的话. (3认同)
  • @nico我是R的新手,我想做类似的事情.我尝试了这个解决方案,但是我收到一个错误:错误:'...'用于不正确的上下文中",你能否评论问题是什么? (2认同)
  • @hadley实际上他们没有.Projects将WD设置为项目目录,该目录与项目子文件夹中的源文件不同.因此,我用于Rstudio项目的相对路径将与编织者使用的路径不同.但最重要的是,如果已经更改了wd,则无法以编程方式将wd重置为正确的任何内容.我[提出了一个建议](http://support.rstudio.org/help/discussions/suggestions/4872-make-set-working-directory-to-source-file-location-useable-as-an-r-function ) 为了这.我对这个功能所属的地方没有强烈的信念,但这是一个令人讨厌的问题. (2认同)
  • 我认为这不是一个很好的解决方案,因为需要提供当前文件的名称。如果文件被重命名怎么办?它不再起作用了。此外,当该程序在RStudio中运行时,它不起作用。 (2认同)
  • 另一个问题是脚本是否使用“Rscript”运行而不是“source”。 (2认同)

Ber*_*ler 7

利用Rscript的隐式"--file"参数

使用"Rscript"(Rscript doc)调用脚本时,脚本的完整路径将作为系统参数给出.以下函数利用此功能提取脚本目录:

getScriptPath <- function(){
    cmd.args <- commandArgs()
    m <- regexpr("(?<=^--file=).+", cmd.args, perl=TRUE)
    script.dir <- dirname(regmatches(cmd.args, m))
    if(length(script.dir) == 0) stop("can't determine script dir: please call the script with Rscript")
    if(length(script.dir) > 1) stop("can't determine script dir: more than one '--file' argument detected")
    return(script.dir)
}
Run Code Online (Sandbox Code Playgroud)


Dir*_*tel 6

如果将代码包装在包中,则始终可以查询包目录的一部分。
这是RGtk2软件包的示例:

> system.file("ui", "demo.ui", package="RGtk2")
[1] "C:/opt/R/library/RGtk2/ui/demo.ui"
> 
Run Code Online (Sandbox Code Playgroud)

您可以对inst/glade/源代码中的目录执行相同操作,该目录将成为glade/已安装软件包中的目录-并system.file()在安装时为您计算路径,而与操作系统无关。