我有一个名为foo.R
的脚本,它包括另一个脚本other.R
,两个脚本位于同一个目录中:
#!/usr/bin/env Rscript
message("Hello")
source("other.R")
但是我希望R
能够找到那个other.R
,无论当前的工作目录是什么。
换句话说,foo.R
需要知道它自己的路径。我该如何做到这一点?
我有一个名为foo.R
的脚本,它包括另一个脚本other.R
,两个脚本位于同一个目录中:
#!/usr/bin/env Rscript
message("Hello")
source("other.R")
但是我希望R
能够找到那个other.R
,无论当前的工作目录是什么。
换句话说,foo.R
需要知道它自己的路径。我该如何做到这一点?
我在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)
> 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