我有一个名为的脚本foo.R包含另一个脚本other.R,该脚本位于同一目录中:
#!/usr/bin/env Rscript
message("Hello")
source("other.R")
Run Code Online (Sandbox Code Playgroud)
但我想R发现other.R无论当前的工作目录是什么.
换句话说,foo.R需要知道自己的路径.我怎样才能做到这一点?
我正在研究R中的一些教程.每个R代码都包含在一个特定的文件夹中.那里有数据文件和其他文件.我想打开.r文件并获取它,这样我就不必更改Rstudio中的工作目录,如下所示:

有没有办法在R中自动指定我的工作目录
我想以编程方式将工作目录设置为当前脚本的路径,但首先我需要获取当前脚本的路径.
所以我希望能够做到:
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:确定执行脚本的路径(一个脚本调用其他脚本;没有找到答案)
sourced或Sweaved文件如何找到自己的路径?
背景:
我使用.R脚本或.Rnw文件工作了很多.我的项目是在一个目录结构中组织的,但是项目基本目录的路径经常在不同的计算机之间变化(例如,因为我只为其他人做了部分数据分析,他们的目录结构与我的不同:我有项目基目录〜/ Projects/StudentName /或〜/ Projects/Studentname/Projectname和大多数只拥有一个项目的学生通常在〜/ Measurements /或〜/ DataAnalysis /或类似的东西下 - 这对我不起作用).
所以像一条线
setwd (my.own.path ())
Run Code Online (Sandbox Code Playgroud)
将是非常有用的,因为它将允许确保工作目录是项目的基本路径,无论该项目实际在哪里.无需用户必须考虑设置工作目录.
让我澄清一下:我寻找的解决方案可以按下不假思索的用户的编辑器/ IDE source或Sweave键盘快捷键.
不久前,我正在阅读一篇关于改进项目工作流程的文章。建议不要使用setwd,否则我的电脑会烧毁:
如果 R 脚本的第一行是
setwd("C:\Users\jenny\path\that\only\I\have")
我会进入你的办公室并点燃你的计算机。
我开始使用这个here包,它运行得很好,直到我开始使用cronR. 问完这个问题后,我的笔记本电脑再次受到纵火威胁:
如果你的 #rstats 脚本的第一行是 wd <- here(),我将进入你的实验室并点燃你的计算机。
由于担心笔记本电脑的安全,我开始使用答案中建议的方法来获取相对文件路径:
wd <- Sys.getenv("HOME")
wd <- file.path(wd, "projects", "my_proj")
Run Code Online (Sandbox Code Playgroud)
这对我有用,但对与我一起工作但没有相同projects目录的人不起作用。所以现在我很困惑。获取相对文件路径以便项目可以移植的最安全/最好的方法是什么?
是否有可能将执行的行或基本上的脚本复制到工作目录中?
所以我的正常情况是,我有一个独立的脚本,只需要在工作目录中获取,他们将完成我需要的一切.几个月后,我对这些脚本进行了更新,我希望在执行源代码时从脚本中获取快照...
所以基本上file.copy(ITSELF, '.')或类似的东西.