确定正在执行的脚本的路径

300

我有一个名为foo.R的脚本,它包括另一个脚本other.R,两个脚本位于同一个目录中:

#!/usr/bin/env Rscript
message("Hello")
source("other.R")

但是我希望R能够找到那个other.R,无论当前的工作目录是什么。

换句话说,foo.R需要知道它自己的路径。我该如何做到这一点?


2
没有 :( 我还没有看到任何真正有效的解决方案。除了通过传递目录或使用环境变量的变通方法。 - Frank
4
让脚本完全可移植且甚至 R 初学者也能执行,这将是非常惊人的! - Etienne Low-Décarie
5
似乎所有答案都需要你在某个时刻输入路径(至少要定位文件)!如果你能发送一个压缩文件夹,让任何运行该文件夹内的R脚本文件都从中读取并保存到其中,那将是很好的。 - Etienne Low-Décarie
17
这个单一问题实际上可能成为我完全转向Python的原因。 - Giacomo
9
@giac_man,我觉得R充满了成百上千个这样微小的问题,它们相互累加,使得工作变得非常困难。 - Michael Barton
显示剩余5条评论
31个回答

0

我在HPC集群环境中工作。我在不同的位置开发我的代码,与我进行生产运行的位置不同。在开发过程中,我通常从命令行交互式地调用R(而不是使用RStudio)。有很多source("foo.R")操作。

在生产运行期间,我通常编写一个bash脚本,尝试不同的参数,并在单独的目录中运行每组参数。bash脚本利用工作负载管理器(即SLURM)。在这种环境下,设置环境变量非常简单。考虑到这一点,以下解决方案最适合我。

other.R

my_message <- function(){
return("R is awkward")
}

foo.R

srcpath = Sys.getenv("R_SRC")
# Check if runnning w/o setting R_SRC - presumably done in directory of development, i.e. /path/to/R/code
if(srcpath == ""){
    srcpath="./"
}
source(sprintf("%s/other.R", srcpath))
string = my_message()
print(string)

如果在 R 交互式 shell 中运行并且位于 /path/to/R/code 目录中,只需执行以下操作:
> source("foo.R")

如果不是从交互式 shell 运行,也不是从 /path/to/R/code 运行,请先设置环境变量 R_SRC,然后调用 Rscript

$ export R_SRC=/path/to/R/code/
$ Rscript /path/to/R/code/foo.R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接