如何从当前运行的R脚本的上下文中获得绝对路径

  • 本文关键字:路径 上下文 运行 脚本 r
  • 更新时间 :
  • 英文 :


使用python,如果我需要当前运行脚本上下文的绝对路径,我只需要在该脚本的代码中添加以下内容:

import os
os.path.abspath(__file__)

这非常有用,因为有了绝对路径,我就可以使用os.path.join为我的项目组件(在项目目录树中(形成新的绝对路径,更有趣的是,无论包目录移动到哪里,一切都将继续工作,没有任何问题。

我需要使用R编程来实现同样的事情,即获得当前运行的R脚本的绝对路径(=其文件在磁盘上的绝对路径(。但在R中尝试做同样的事情是非常具有挑战性的,至少对我这个R 的初学者来说是这样

经过大量的谷歌搜索,我试图使用reticulate包从R调用Python,但__file__在那里不可用,然后我在Stackoverflow上发现一些线程建议使用正在运行的Stack,其他线程则建议使用normalizePath。然而,当整个项目包从一个目录转移到另一个目录时,这些都不起作用。

因此,我想知道,例如,你是否有以下文件/目录树

base_dir ( = /home/usr1/apps/R/base_dir)
|
|
|___ myscript.R (this is my R script to be run)
|___ data (this is a directory)
|___ sql  (this is a directory)

是否有任何解决方案允许在myscript.R的代码中添加一些内容,以便在脚本中程序始终可以知道基本目录是/home/usr1/apps/R/base_dir,如果稍后将该基本目录移动到另一个目录,则无需更改代码,并且程序能够正确地找到新的基本目录?

R通常无法找到此路径,因为R中没有等价于Python的__file__

最接近的方法是查看commandArgs()并费力地提取脚本文件名(这需要根据脚本的启动方式进行不同的处理!(。但如果脚本是在RStudio中执行的,这将失败,并且在调用setwd()后将失败。

其他解决方案(如"here"包(依赖于启发法和特定的项目结构。

但幸运的是,实际上有一个始终有效的解决方案:使用'box'模块

使用模块,您将始终能够通过box::file()获取当前脚本/模块的路径。这与R中的Python的__file__最为相似,而且它总是有效的——只要你始终如一地使用"box"模块。

(在内部,"box"包需要复杂的逻辑来确定file()函数在所有情况下的值;我不建议复制它,因为它太复杂了。对于好奇的人来说,大部分相关逻辑都在R/loaded.r中。(

如果使用Rscript运行脚本,则可以使用getwd()

#!/usr/bin/Rscript
getwd()
# or assign it to a variable
base_dir = getwd()

您可以使用以下之一从命令行运行它

./yourscript.R
# or
Rscript yourscript.R

但是,请注意,只有当您从文件夹中运行脚本时,该文件才有效。

cd ~
./script.R
# "/home/usr1"
cd /
/home/usr1/script.R
# "/"

对于更详细的选择,您可以考虑https://stackoverflow.com/a/55322344/3250126

最新更新