用于设定工作目录到 Rstudio 的源文件位置的 R 命令

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

enter image description here

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

179196 次浏览

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

?Startup

RStudio 的文档说:

“当通过文件关联启动时,RStudio 会自动将工作目录设置为打开的文件的目录。”默认设置是将 RStudio 注册为。文件,不过也提到了设置与 RStudio 的默认“关联”的能力。Rdata 和。R 型分机。在 Linux 上,具有“处理程序”状态和“关联”状态是否相同,我不能说。

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

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

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

把它放到文件的某个地方(最好是开头) ,这样 wd 就可以根据该文件进行更改。

根据评论,这可能不一定适用于所有平台(Windows 似乎可以,Linux/Mac 也可以)。 请记住,这种解决方案是为了“源”文件,而不一定是为了运行该文件中的块。

另见 获取‘ source’d 文件的文件名和路径

解决办法

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

我知道这已经过时了,但是我不能让以前的答案非常令人满意地工作,所以我想贡献我的方法,以防其他人遇到同样的错误,在 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"。希望这对其他可能卡住的人有所帮助。

这个答案可能会有所帮助:

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)对我不起作用,我总是得到一个错误。

我只是在寻找这个问题的解决方案,找到了这一页。我知道它的过时,但以前的解决方案,不令人满意或不适合我。这是我的工作,如果有兴趣的话。

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::getSrcDirectoryutils::getSrcFilename。因此,将工作目录更改为当前文件的格式可以通过以下方法完成:

setwd(getSrcDirectory()[1])

如果您使用的是 快跑代码而不是 来源ing 代码,那么这在 RStudio 中就不起作用。为此,您需要使用 rstudioapi::getActiveDocumentContext

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

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

dirname(parent.frame(2)$ofile)

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

dirname(rstudioapi::getActiveDocumentContext()$path)

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

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

对我有用。

dirname(rstudioapi::getActiveDocumentContext()$path)

对我有用,但是如果你不想使用 Rstudioapi,并且你不在一个项目中,你可以在你的路径中使用符号 ~ 。符号 ~ 指的是默认的 RStudio 工作目录(至少在 Windows 上是这样)。

RStudio options

如果您的 RStudio 工作目录是“ D:/document”,则 setwd("~/proyect1")与 setwd (“ D:/document/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")相同

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

我意识到这是一个老主题,但是我有一个类似的问题需要设置工作目录,并且不能得到任何解决方案为我工作。以下是起作用的方法,以防以后有人无意中发现:

# 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,因此没有办法知道我将最终在哪个目录(作业被分配了一个数字和一个计算节点)。这招对我很管用。

如果你使用 UTF-8编码:

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

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

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

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

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

下面是另一种方法:

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

我觉得自己像只知更鸟,但我还是要说: 我知道这篇文章很老,但是... ..。

我最近才知道,当从任务计划程序运行脚本时,不能调用 api。蝙蝠档案。我可是吃了不少苦头才知道的。我想那些使用 < b > rstudioapi: : 方法的人可能会想知道。我们一夜之间运行了很多剧本。最近我们改变了我们的路径来包含被调用的 api,这样我们就可以“动态”设置工作目录。然后,当我们尝试的第一个失败时,从任务调度程序触发,调查带来的信息。

这是揭示这个问题的实际代码: < br > < i > < b > setwd (dirname (rstudioapi: : getActiveDocumentContext () $path))

如果你正在运行脚本,工作很漂亮!

我只是加了两分,因为我知道人们仍然把这些线索,认为这可能会有帮助。

setwd(this.path::here())

同时适用于源脚本和“活动”脚本。