【问题标题】:How to get the absolute path from the context of the current running R script?如何从当前运行的 R 脚本的上下文中获取绝对路径?
【发布时间】:2021-08-26 06:39:52
【问题描述】:

使用 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


    【解决方案1】:

    R 通常无法找到这条路径,因为在 R 中没有与 Python 的 __file__ 等效的东西。

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

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

    但幸运的是,实际上有一个始终有效的解决方案:使用 ‘box’ modules

    使用模块,您将始终能够通过box::file() 获取当前脚本/模块的路径。这是与 Python 的 __file__ 最接近的等效项,您将在 R 中获得它,并且它始终有效 - 只要您使用“盒子”模块 consistently

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

    【讨论】:

      【解决方案2】:

      如果您使用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

      【讨论】:

      • getwd() 为您提供当前工作目录,而不是脚本路径。正如您在回答中指出的那样,这两者完全无关。
      猜你喜欢
      • 1970-01-01
      • 2014-01-05
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2010-10-20
      • 2013-09-22
      相关资源
      最近更新 更多