如何获取其中的目录路径的Bash脚本位于,里面那个脚本?
例如,假设我想使用Bash脚本作为另一个应用程序的启动器.我想将工作目录更改为Bash脚本所在的目录,因此我可以对该目录中的文件进行操作,如下所示:
$ ./application
我正在研究R中的一些教程.每个R代码都包含在一个特定的文件夹中.那里有数据文件和其他文件.我想打开.r文件并获取它,这样我就不必更改Rstudio中的工作目录,如下所示:

有没有办法在R中自动指定我的工作目录
有没有办法以编程方式在脚本本身内找到R脚本的路径?
我问这个是因为我有几个脚本使用RGtk2并从.glade文件加载GUI.
在这些脚本中,我不得不setwd("path/to/the/script")在开头放置一条指令,否则将找不到.glade文件(位于同一目录中).
这很好,但如果我将脚本移动到另一个目录或另一台计算机,我必须更改路径.我知道,这不是什么大问题,但有一些东西会很好:
setwd(getScriptPath())
那么,是否存在类似的功能?
在处理大型代码库时,使用相对路径获取文件很有用.其他编程语言具有明确定义的机制,用于使用相对于所源文件的目录的路径来获取文件.一个例子是Ruby的require_relative.在R中实施相对路径采购的好方法是什么?
下面是我使用各种食谱和R论坛帖子拼凑的一段时间.它对于我的直接开发来说效果很好,但并不健全.例如,特别是在通过testthat库加载文件时它会中断auto_test().rscript_stack()回报character(0).
# Returns the stack of RScript files
rscript_stack <- function() {
Filter(Negate(is.null), lapply(sys.frames(), function(x) x$ofile))
}
# Returns the current RScript file path
rscript_current <- function() {
stack <- rscript_stack()
r <- as.character(stack[length(stack)])
first_char <- substring(r, 1, 1)
if (first_char != '~' && first_char != .Platform$file.sep) {
r <- file.path(getwd(), r)
}
r
}
# Sources relative to the current script
source_relative <- function(relative_path, ...) {
source(file.path(dirname(rscript_current()), relative_path), …Run Code Online (Sandbox Code Playgroud) 我想以编程方式将工作目录设置为当前脚本的路径,但首先我需要获取当前脚本的路径.
所以我希望能够做到:
current_path = ...retrieve the path of current script ...
setwd(current_path)
Run Code Online (Sandbox Code Playgroud)
到目前为止我试过:
initial.options <- commandArgs(trailingOnly = FALSE)
file.arg.name <- "--file="
script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])
script.basename <- dirname(script.name)
Run Code Online (Sandbox Code Playgroud)
script.name 返回NULL
source("script.R", chdir = TRUE)
Run Code Online (Sandbox Code Playgroud)
返回:文件中的错误(文件名,"r",编码=编码):无法打开连接另外:警告消息:在文件中(文件名,"r",编码=编码):无法打开文件'/script.R' : 没有相应的文件和目录
dirname(parent.frame(2)$ofile)
Run Code Online (Sandbox Code Playgroud)
返回:dirname中的错误(parent.frame(2)$ ofile):期望的字符向量参数 ...因为parent.frame为null
frame_files <- lapply(sys.frames(), function(x) x$ofile)
frame_files <- Filter(Negate(is.null), frame_files)
PATH <- dirname(frame_files[[length(frame_files)]])
Run Code Online (Sandbox Code Playgroud)
返回:Null,因为frame_files是0的列表
thisFile <- function() {
cmdArgs <- commandArgs(trailingOnly = FALSE)
needle <- "--file="
match <- grep(needle, cmdArgs)
if (length(match) > 0) …Run Code Online (Sandbox Code Playgroud) 我已经查看了许多与此相似的问题(见帖子末尾),但我没有找到任何实际完成我需要的解决方案.我根据项目在Windows或Fedora上编码,我为使用Windows和几个Linux发行版的人编写代码.
我的部分工作是为自动分析数据和创建图形的人制作R脚本.最常见的是,我只是向他们发送脚本,它将生成图表.这样,如果数据发生变化或扩展,我不需要为它们重新运行脚本(也可以根据需要进行更改).
问题是我不知道如何获得一个R脚本来找出它自己的位置.能够创建如下工作的代码将非常方便:
这个问题只涉及第2步.只要我能做到这一点,其他所有事情都会顺利进行.有这样的东西会很高兴:
setwd(FindThisScriptsLocation())
Run Code Online (Sandbox Code Playgroud)
该行:源(...,CHDIR = T)已建议在这里,但它不能被用于一个脚本来引用自身,除非它知道自己的路.
以下是一些相关问题:
.R脚本文件在哪里...(处理包)
如何让R识别您的工作目录...(设置默认工作目录)
Rscript:确定执行脚本的路径(一个脚本调用其他脚本;没有找到答案)
RStudio有一个有用的功能:
Session -> Set Working Directory -> To Source File Location
Run Code Online (Sandbox Code Playgroud)
有没有办法在不使用下拉菜单的情况下执行此操作?
更新:
也许更好的方式是:
是否有命令返回当前r脚本的文件路径?
我也找到了这个帖子,但解决方案对我没用.甚至不是哈德利!
我试图了解 here() 如何以可移植的方式工作。找到它:在最终答案下查看稍后的工作- TL; DR - 底线,从命令行here()运行 a 并不是那么有用script.R。
我在 JBGruber 的帮助下理解它的方式:here()查找项目的根目录(例如,RStudio 项目、Git 项目或其他使用 .here 文件定义的项目)从当前工作目录开始并向上移动,直到找到任何项目。如果它没有找到任何东西,它会退回到使用完整的工作目录。如果由 cron 运行的脚本将默认为我的主目录。当然,可以通过 cron 命令将目录作为参数传递,但它相当麻烦。下面的答案提供了很好的解释,我总结了我在“最终答案部分”下发现最有用的内容。但不要误会,尼古拉的回答非常好,也很有帮助。
原始目标- 编写一组 R 脚本,包括 R-markdown,.Rmd以便我可以压缩目录,发送给其他人,并且它可以在他们的计算机上运行。可能在非常低端的计算机上 - 例如 RaspberryPi 或运行 linux 的旧硬件。
状况:
Rscriptcronset_here()- 从控制台执行一次,然后该文件夹是可移植的,因为该.here文件包含在压缩目录中。Rstudio- 因此不想做 R 项目Rstudio(开发)shiny(我认为如果满足上述条件就可以了)我特别不想创建 Rstudio 项目,因为在我看来它需要安装和使用 Rstudio,但我希望我的脚本尽可能可移植并在低资源、无头平台上运行。
让我们假设工作目录myGoodScripts如下:
/Users/john/src/myGoodScripts/ …
出于调试目的,我想打印调用当前函数的位置的行号(和函数名称)。我如何在 R 中得到这个?
我见过获取源文件名的解决方案 但是如何获取行号和函数名?]
编辑:我找到了如何以traceback()某种形式获取这些数据,回溯能够将其打印出来,但我不确定如何从中解码信息:
f <- function () {
traceback(x = 3, max.lines = 1)
}
g <- function()
{
f()
}
x <- g()
source("file.R") # file with this code
# 5: g() at file.R#20
# 4: eval(ei, envir)
# 3: eval(ei, envir)
# 2: withVisible(eval(ei, envir))
# 1: source("file.R")
str(x[[1]])
# chr "g()"
# - attr(*, "srcref")= 'srcref' int [1:8] 20 1 20 8 1 8 20 20
# ..- attr(*, …Run Code Online (Sandbox Code Playgroud) 我正在Rstudio中编写一个R脚本,我想要一些方法来获取编写代码的文件的名称.我想要这样做的原因是我想要一段代码我可以坚持在底部我的所有脚本,以便我的结果会自动通过sendmailR包发送给我.
我希望我的附件名称具有filename_date结构,其中filename是正在执行的文件的名称,date是执行的时间.有没有办法这样做,或者我每次运行新脚本时都必须手动输入文件名.
这里也提出了类似的问题,但由于使用方法的不同,解决方案解决方案从未提供过答案.我实际上不需要位置,只需要文件名,我认为这应该是可行的(但可能不是)
Rscript:确定执行脚本的路径(问基本相同的问题,但想要整个路径,没有接受的答案)