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 通常无法找到这条路径,因为__file__
在 R中没有与 Python 等效的路径。
您可以获得的最接近的方法是查看commandArgs()
并费力地提取脚本文件名(这需要根据脚本的启动方式进行不同的处理!)。但是如果脚本是在 RStudio 中执行的,这将失败,并且在调用setwd()
.
其他解决方案(例如“here”包)依赖于启发式方法和特定的项目结构。
但幸运的是,实际上有一个始终有效的解决方案:使用'box' modules。
使用模块,您将始终能够通过box::file()
. 这是你在 R 中得到的最接近 Python 的等价物__file__
,而且它总是有效的——只要你始终使用“盒子”模块。
(在内部,'box'包需要复杂的逻辑来确定file()
函数在所有情况下的值;我不建议复制它,它太复杂了。对于好奇,大部分相关逻辑都在R/loaded.r
。)
推荐阅读
- javascript - 隐藏地址栏时,Android Chrome 会在页面底部添加额外空间
- django - django allauth:如何获取linkedin 数据 - r_basicprofile、position_fields、location_fields
- python - 在 SKLearn Logistic Regression 中,class = Balanced 有助于使用不平衡数据运行模型?此选项使用什么方法
- kubernetes - 查看 Helm 图表的模板文件
- llvm - LLVM:指令不支配所有用途 - 没有控制流
- javascript - Bootstrap Modal 关闭后不按键重新打开
- python - 使用 CountVectorizer 时如何限制令牌长度?
- php - 如何防止蛮力/字典攻击?
- android-studio - Android Studio logcat 搜索栏
- python - 在另一个 python 文件中运行两个带有无限循环的 python 文件