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

时间:2012-12-02 19:10:28

标签: r automation working-directory

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

enter image description here

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

16 个答案:

答案 0 :(得分:59)

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

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

把它放在文件的某处(尽管最好是开头),以便根据该文件更改wd。

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

另见get filename and path of `source`d file

答案 1 :(得分:46)

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

setwd(getSrcDirectory()[1])

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

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

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

答案 2 :(得分: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)对我不起作用,我总是收到错误。

答案 3 :(得分:6)

<p class="ticket-message">My message</p>
<p class="ticket-activity">Activity</p>
<p class="ticket-activity">Another activity</p>
<p class="ticket-message">Another message</p>
<p class="ticket-activity">Some activity here</p>
<p class="ticket-message">My message</p>
<p class="ticket-activity">Activity</p>
<p class="ticket-activity">Another activity</p>
<p class="ticket-activity">Another activity</p>
<p class="ticket-message">Another message</p>
<p class="ticket-activity">Some activity here</p>

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

RStudio options

如果您的RStudio工作目录是“D:/ Documents”,dirname(rstudioapi::getActiveDocumentContext()$path) 与setwd(“D:/ Documents / proyect1”)相同。

设置完成后,您可以导航到子目录:setwd("~/proyect1")。与read.csv("DATA/mydata.csv")相同。

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

相同

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

答案 4 :(得分: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])

答案 5 :(得分:5)

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

答案 6 :(得分: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)

答案 7 :(得分:2)

我知道这已经过时了,但是我无法让前面的答案工作得非常令人满意,所以我想贡献我的方法,以防任何其他人遇到BumbleBee评论中提到的相同错误&#39;答案。

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

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"。希望这可以帮助其他可能卡住的人。

答案 8 :(得分:2)

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

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

它对我有用。

答案 9 :(得分:2)

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

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

答案 10 :(得分:0)

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

?Startup

RStudio文档说:

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

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

答案 11 :(得分:0)

dirname(parent.frame(2)$ofile)  

doesn't work for me either, but the following (as suggested in https://stackoverflow.com/a/35842176/992088) works for me in ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)

答案 12 :(得分:0)

如果您使用UTF-8编码:

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

如果你还没有完成它,你需要安装软件包rstudioapi。

答案 13 :(得分:0)

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

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

答案 14 :(得分: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()

答案 15 :(得分:0)

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

我为每个系统都想出了一个通用的解决方案,它既适用于 RStudio,也适用于终端脚本执行

对于 Windows

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

对于 UNIX 系统(Linux、Macintosh 等...)

setwd(shell("echo %cd%", intern = TRUE))