R命令,用于在Rstudio中将工作目录设置为源文件位置

R命令,用于在Rstudio中将工作目录设置为源文件位置,r,automation,working-directory,R,Automation,Working Directory,我正在用R编写一些教程。每个R代码都包含在一个特定的文件夹中。里面有数据文件和其他文件。我想打开.r文件并对其进行源代码设置,这样我就不必更改Rstudio中的工作目录,如下所示: 是否有一种方法可以在R中自动指定我的工作目录。大多数GUI都假定,如果您在一个目录中并“打开”,双击或以其他方式尝试执行.R文件,则除非另有指定,否则它所在的目录将是工作目录。Mac GUI提供了一种更改默认行为的方法,该默认行为可在您在运行会话中设置的首选项启动面板中更改,并在下一次“启动”时生效。您还应该看到:

我正在用R编写一些教程。每个R代码都包含在一个特定的文件夹中。里面有数据文件和其他文件。我想打开
.r
文件并对其进行源代码设置,这样我就不必更改Rstudio中的工作目录,如下所示:


是否有一种方法可以在R中自动指定我的工作目录。

大多数GUI都假定,如果您在一个目录中并“打开”,双击或以其他方式尝试执行.R文件,则除非另有指定,否则它所在的目录将是工作目录。Mac GUI提供了一种更改默认行为的方法,该默认行为可在您在运行会话中设置的首选项启动面板中更改,并在下一次“启动”时生效。您还应该看到:

?Startup
RStudio文档说明:


“当通过文件关联启动时,RStudio会自动将工作目录设置为打开文件的目录。”默认设置是将RStudio注册为.R文件的处理程序,不过也提到了可以为.Rdata和.R扩展名设置与RStudio的默认“关联”。Linux上的“handler”状态和“association”状态是否相同,我无法判断


我知道这个问题已经过时,但我也在寻找解决方案,谷歌在最上面列出了这个问题:

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)
this.dir解决方案

dirname(parent.frame(2)$ofile)
不为我工作

我使用的是暴力算法,但有效:

File <- "filename"
Files <- list.files(path=file.path("~"),recursive=T,include.dirs=T)
Path.file <- names(unlist(sapply(Files,grep,pattern=File))[1])
Dir.wd <- dirname(Path.file)

File我知道这已经过时了,但我无法让以前的答案非常令人满意,所以我想贡献我的方法,以防其他人遇到大黄蜂答案评论中提到的相同错误

Mine基于一个简单的系统命令。为函数提供的所有内容都是脚本的名称:

extractRootDir <- function(x) {
    abs <- suppressWarnings(system(paste("find ./ -name",x), wait=T, intern=T, ignore.stderr=T))[1];
    path <- paste("~",substr(abs, 3, length(strsplit(abs,"")[[1]])),sep="");
    ret <- gsub(x, "", path);
    return(ret);
}

setwd(extractRootDir("myScript.R"));
extractRootDir这个答案可以帮助:

script.dir <- dirname(sys.frame(1)$ofile)

script.dir我只是在寻找这个问题的解决方案,来到这个页面。我知道它过时了,但以前的解决方案不令人满意或对我不起作用。如果有兴趣,这是我的作品

filename = "your_file.R"
filepath = file.choose()  # browse and select your_file.R in the window
dir = substr(filepath, 1, nchar(filepath)-nchar(filename))
setwd(dir)

要获取源代码脚本的位置,可以使用
utils::getSrcDirectory
utils::getsrcdilename
。因此,可以通过以下方法将工作目录更改为当前文件的工作目录:

setwd(getSrcDirectory()[1])
如果您运行代码而不是源代码,那么这在RStudio中不起作用。为此,需要使用
rstudioapi::getActiveDocumentContext

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
当然,第二种解决方案需要使用RStudio作为IDE

dirname(parent.frame(2)$ofile)  
也不适合我,但以下(如中所建议的)在ubuntu 14.04中适合我

dirname(rstudioapi::getActiveDocumentContext()$path)

如果您在Linux上工作,可以尝试以下方法:

setwd(系统(“pwd”,intern=T))

它对我有用

dirname(rstudioapi::getActiveDocumentContext()$path)
对我来说是可行的,但是如果您不想使用rstudioapi,并且您不在项目中,您可以在路径中使用符号~。符号~表示默认的RStudio工作目录(至少在Windows上)

如果您的RStudio工作目录是“D:/Documents”,则
setwd(“~/proyect1”)
与setwd(“D:/Documents/proyect1”)相同

设置后,可以导航到子目录:
read.csv(“DATA/mydata.csv”)
。与读取.csv(“D:/Documents/proyect1/DATA/mydata.csv”)
相同

如果要导航到父文件夹,可以使用
。/“
。 例如:
read.csv(“../olddata/DATA/mydata.csv”)
,与
read.csv(“D:/Documents/oldata/DATA/mydata.csv”)相同。


这是我编写脚本的最佳方式,无论您使用的是哪台计算机。

我意识到这是一个旧线程,但我也遇到了类似的问题,需要设置工作目录,因此无法获得任何适合我的解决方案。以下是成功的方法,以防其他人稍后偶然发现:

# SET WORKING DIRECTORY TO CURRENT DIRECTORY:
system("pwd=`pwd`; $pwd 2> dummyfile.txt")
dir <- fread("dummyfile.txt")
n<- colnames(dir)[2]
n2 <- substr(n, 1, nchar(n)-1)
setwd(n2)
#将工作目录设置为当前目录:
系统(“pwd=`pwd`;$pwd2>dummyfile.txt”)

dir如果使用UTF-8编码:

path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))
path对于,您可以自动将工作目录设置为脚本目录,如下所示:

library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )
这在运行或源文件时有效

您需要首先安装包rstudioapi。 请注意,我打印路径是为了100%确保我在正确的位置,但这是可选的。

该包提供了
here()
函数,该函数基于一些启发式返回项目根目录


这不是一个完美的解决方案,因为它找不到脚本的位置,但它满足了某些目的,所以我想把它放在这里。

这里是另一种方法:


set2我已经尝试了上面的所有答案,其中大多数在某些情况下都失败了。并且依赖于RStudio,当从终端执行脚本时,它们中的大多数都不起作用

我已经为每个系统提出了一个通用的解决方案,它既可以从RStudio工作,也可以从终端脚本执行工作

窗户 用于UNIX系统(Linux、Macintosh等)
这可能是个骗局。请参见
?setwd
?getwd
非重复,海报希望
加载同一文件夹中的
.rdata文件,而不是
,并将工作目录设置为源文件的路径。请确保RStudio不会做出这种假设。它的行为与我在计算机上描述的方式相同。我没有对RStudio首选项做任何特殊的操作。在Linux上没有这样做:)“通过文件关联启动时”是这里的关键条件。有些人可能通过终端中的快捷方式或命令启动Rstudio。您需要打开该文件,并将打开.R文件的默认值设置为Rstudio。如果先打开Rstudio(然后打开文件),它将无法按所述工作。通过文件关联,上述答案在windows和mac中有效(可能不是@nico指出的linux)
library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )
setwd(system("pwd", intern = TRUE))
setwd(shell("echo %cd%", intern = TRUE))