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


135

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

在此处输入图片说明

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


这可能是骗子。看到?setwd ?getwd
布兰登·贝特尔森


3
不是伪造者,发布者希望将load.rdata文件放在同一文件夹中,而不source要将工作目录设置为源文件的路径。
鲁宾

Answers:


76

要获取源脚本的位置,可以使用utils::getSrcDirectoryutils::getSrcFilename。因此,可以使用以下命令将工作目录更改为当前文件的目录:

setwd(getSrcDirectory()[1])

如果您运行代码而不是代码,则这在RStudio中不起作用。为此,您需要使用rstudioapi::getActiveDocumentContext

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

当然,第二种解决方案要求您将RStudio用作IDE。


您可以在stackoverflow.com/a/35842176/1247080上找到自己的答案(尽管其中必须包含目录名)。我添加了
Stat-R

对我不起作用。我明白了Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru

2
请注意,当您getActiveDocumentContext()在RStudio的控制台中运行时,该路径报告为''。但是,如果在编辑器部分中运行代码行,它将按预期执行。这可以解决@Andru的评论
威震天

1
@giac_man听起来您正在使用该rstudioapi软件包的旧版本。尝试更新到最新版本。
Richie Cotton

1
@mjs在控制台的顶部,您应该看到当前的工作目录。右边是一个小箭头。单击该按钮可在文件浏览器中显示当前工作目录。
Richie Cotton

62

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

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)

将其放在文件中的某个位置(不过最好以开始),以便根据该文件更改wd。

根据评论,这不一定在所有平台上都可以运行(Windows似乎可以运行,Linux / Mac可以运行)。请记住,此解决方案仅用于“采购”文件,而不必用于在该文件中运行块。

另请参阅获取源文件d的文件名和路径


99
也不对我Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
有用

4
这里的问题与Linux上的@Matt O'Brien相同。
patapouf_ai 2015年

3
完美地工作,如果来源。
m-dz

2
在Windows 10上的RStudio v1.0.143中为我工作。如果选择“保存时保存源”,它将正常工作(可以使用“ cat”打印出检测到的目录)。如果选择这些行然后执行它们,则结果为空。
Contango

2
在Mac上寻找文件时,这对我适用。但是,正如@Contango指出的那样,当通过突出显示一个块并按Command + Return交互式执行代码时,它将不起作用。在这种情况下,由于您没有采购文件,因此没有源文件可以从中提取工作目录。答案不必指定特定于平台的警告。
bmosov01

7
dirname(rstudioapi::getActiveDocumentContext()$path)

适用于我,但是如果您不想使用rstudioapi并且不属于proyect,则可以在路径中使用符号〜。符号〜表示默认的RStudio工作目录(至少在Windows上)。

RStudio选项

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

设置完之后,您可以导航到一个子目录:read.csv("DATA/mydata.csv")。与相同read.csv("D:/Documents/proyect1/DATA/mydata.csv")

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

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



6

对于rstudio,您可以使用rstudioapi将工作目录自动设置为脚本目录,如下所示:

library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )

运行或源文件时,此方法有效。

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


setwd(dirname(current_path))中的错误:无法更改工作目录
tavalendo

@helmo检查您的用户对目标目录具有写权限。
gagarine

5

解决方案

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)

搜索目录更容易:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])

1
该解决方案的问题是非常慢。搜索所有文件并将其存储在变量中也会占用大量内存。
tavalendo

4

如果您使用Linux,则可以尝试以下操作:

setwd(system("pwd", intern = T) )

这个对我有用。


1
这只是提供您的主目录(您的Shell开始的位置)。
坎纳

它提供了您运行脚本所在目录的路径。
塔兹

2
pwd代表当前的工作目录。这会将目录设置为Shell当前目录所在的目录。
PeterVermont

pwd也可以在PowerShell(目前被视为Windows上的默认外壳)中使用,它是的别名Get-Location
BroVic

3

我只是在寻找解决此问题的方法,来到了此页面。我知道它已经过时,但是以前的解决方案对我来说并不令人满意或不起作用。如果有兴趣,这是我的工作。

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)

您为什么不仅仅使用一个原因setwd( dirname(filepath) )
jodis

3

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

# 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)

这有点令人费解,但是基本上,这是使用系统命令来获取工作目录并将其保存到dummyfile.txt,然后R使用data.table :: fread读取该文件。剩下的只是清理打印到文件的内容,这样我只剩下目录路径。

我需要在集群上运行R,因此无法知道我最终位于哪个目录(作业被分配了一个数字和一个计算节点)。这对我有用。


2

我知道这已经过时了,但是我无法使以前的答案令人满意,因此我想贡献自己的方法,以防其他任何人遇到BumbleBee答案中的注释中提到的相同错误。

我的是基于简单的系统命令。您提供的所有功能就是脚本的名称:

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"));

该函数的输出如下所示"/Users/you/Path/To/Script"。希望这对其他可能陷入困境的人有所帮助。


1

here软件包提供的here()功能,基于一些启发式返回你的项目的根目录。

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


1
感谢您的回答。当前脚本的位置可以通过here::set_here()在源中调用来利用。
BroVic

0

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

?Startup

RStudio文档说:

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

http://www.rstudio.com/ide/docs/using/workspaces


4
当然,RStudio不会做出这种假设。
nico 2012年

1
它的行为与我在计算机上描述的方式相同。我没有对RStudio首选项执行任何特殊操作。
IRTFM

2
在Linux上不这样做:)
nico

2
此处的关键条件是“通过文件关联启动时”。某些人可能是通过终端中的快捷方式或命令启动Rstudio的。您需要打开文件,并且打开.R文件的默认值为Rstudio。如果先打开Rstudio(然后打开文件),它将无法按照说明进行操作。通过文件关联,以上答案可在Windows和Mac中使用(@nico指出,Linux可能无法使用-但由于我没有Linux机器,因此我无法进行验证)。
WetlabStudent 2014年

0
dirname(parent.frame(2)$ofile)  

也不适合我,但是以下内容(如https://stackoverflow.com/a/35842176/992088中所建议)在ubuntu 14.04中对我适用

dirname(rstudioapi::getActiveDocumentContext()$path)

1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'也在Ubuntu 14.04中
Rich Scriven

也许您可以尝试先安装rstudioapi软件包。
Lamothy

那很奇怪。我在32位ubuntu 14.04中使用R-3.2.4。我希望不是因为操作系统或R的不同版本
。– Lamothy

0

如果您使用UTF-8编码:

path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))

如果尚未安装软件包rstudioapi,则需要安装它。


setwd(dirname(path))中的错误:无法更改工作目录
tavalendo

setWd(dirname(path))中的错误:无法更改工作目录您的解决方案不起作用,请检查您的回答
S Coder先生

0

这是另一种方法:

set2 <- function(name=NULL) {
  wd <- rstudioapi::getSourceEditorContext()$path
  if (!is.null(name)) {
    if (substr(name, nchar(name) - 1, nchar(name)) != '.R') 
      name <- paste0(name, '.R')
  }
  else {
    name <- stringr::word(wd, -1, sep='/')
  }
  wd <- gsub(wd, pattern=paste0('/', name), replacement = '')
  no_print <- eval(expr=setwd(wd), envir = .GlobalEnv)
}
set2()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.