158

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

在此处输入图像描述

有没有办法在 R 中自动指定我的工作目录。

4

16 回答 16

107

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

setwd(getSrcDirectory()[1])

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

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

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

于 2016-03-07T11:06:36.153 回答
65

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

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

把它放在文件的某个地方(最好是开始),以便根据该文件更改 wd。

根据评论,这可能不一定适用于每个平台(Windows 似乎工作,Linux/Mac 一些)。请记住,此解决方案用于“采购”文件,不一定用于在该文件中运行块。

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

于 2014-09-23T13:09:13.460 回答
8
dirname(rstudioapi::getActiveDocumentContext()$path)

对我有用,但如果你不想使用rstudioapi并且你不在项目中,你可以在你的路径中使用符号 ~。符号 ~ 指的是默认的 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")

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

于 2016-12-02T13:01:03.813 回答
8

对于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% 确定我在正确的位置,但这是可选的。

于 2018-05-10T20:49:00.783 回答
6

这个答案可以帮助:

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

注意:必须获取脚本才能返回正确的路径

我在以下位置找到它: https: //support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-

BumbleBee 的答案(使用 parent.frame 而不是 sys.frame)对我不起作用,我总是收到错误消息。

于 2015-04-25T22:39:38.477 回答
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])
于 2014-11-21T09:23:19.050 回答
5

如果你在 Linux 上工作,你可以试试这个:

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

这个对我有用。

于 2016-07-01T17:16:08.033 回答
4

here包提供了该here()功能,该功能根据一些启发式方法返回您的项目根目录。

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

于 2019-08-28T20:24:09.773 回答
4

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

# 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,所以无法知道我最终会进入哪个目录(作业被分配了一个数字和一个计算节点)。这对我有用。

于 2017-06-02T22:52:49.977 回答
3

我知道这已经过时了,但我无法让以前的答案非常令人满意,所以我想贡献我的方法,以防其他人遇到 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"。希望这可以帮助其他可能陷入困境的人。

于 2015-03-17T16:36:34.033 回答
2

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

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)
于 2016-01-24T15:59:33.473 回答
1

如果您使用 UTF-8 编码:

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

如果您还没有安装包 rstudioapi,则需要安装它。

于 2017-06-21T08:39:51.647 回答
0

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

?Startup

RStudio 文档说:

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

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

于 2012-12-02T19:41:59.233 回答
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()
于 2020-03-11T10:24:56.110 回答
0

我感觉自己像只知更鸟,但我要说:我知道这篇文章很旧,但是......

我最近才了解到,从任务计划程序和 .bat 文件运行脚本时,您不能调用 api。我经过惨痛的教训才学到这个。认为那些使用任何rstudioapi::方法的人可能想知道这一点。我们以这种方式在一夜之间运行了很多脚本。最近刚刚更改了我们的路径以包含调用的 api,以便我们可以“动态”设置工作目录。然后,当我们尝试的第一个尝试在任务计划程序触发时失败时,调查带来了该信息。

这是使这个问题曝光的实际代码:
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

如果您正在运行脚本,则效果很好!

只需加上我的两分钱,因为我知道人们仍然会拉起这些线程,认为这可能会有所帮助。

于 2022-02-21T17:41:59.047 回答
0
dirname(parent.frame(2)$ofile)  

对我也不起作用,但以下(如https://stackoverflow.com/a/35842176/992088中所建议的)在 ubuntu 14.04 中对我有用

dirname(rstudioapi::getActiveDocumentContext()$path)
于 2016-04-12T00:53:09.843 回答