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

Sta*_*t-R 118 automation r working-directory

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

在此输入图像描述

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

Bum*_*Bee 61

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

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 对我来说也不起作用:`dirname中的错误(parent.frame(2)$ ofile):预期的字符向量参数 (94认同)
  • 与Linux上的@Matt O'Brien相同的问题. (4认同)
  • 如果来源,工作完美. (3认同)
  • 在Windows 10上的RStudio v1.0.143中为我工作。如果选择“保存时保存源”,它将正常工作(您可以使用“ cat”打印出检测到的目录)。如果选择这些行然后执行它们,则结果为空。 (2认同)
  • 在Mac上寻找文件时,这对我适用。但是,正如@Contango指出的那样,当通过突出显示一个块并按Command + Return交互式执行代码时,它将无法工作。在这种情况下,由于您不采购文件,因此没有源文件可以从中提取工作目录。答案不必指定特定于平台的警告。 (2认同)

Ric*_*ton 54

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

setwd(getSrcDirectory()[1])
Run Code Online (Sandbox Code Playgroud)

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

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,当您在RStudio的控制台中运行`getActiveDocumentContext()`时,路径将报告为'''`。但是,如果在编辑器部分中运行代码行,它将按预期执行。这可以解决@Andru的评论 (2认同)
  • 当我获取文件时, `setwd(getSrcDirectory()[1])` 对我不起作用。“rstudioapi”解决方案有效。 (2认同)

小智 7

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

# 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)
Run Code Online (Sandbox Code Playgroud)

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

我需要在集群上运行 R,因此无法知道我最终会进入哪个目录(作业被分配一个编号和一个计算节点)。这对我来说很有效。


sie*_*nos 6

这个答案可以帮助:

script.dir <- dirname(sys.frame(1)$ofile)
Run Code Online (Sandbox Code Playgroud)

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

我发现它:https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-

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


小智 6

dirname(rstudioapi::getActiveDocumentContext()$path)
Run Code Online (Sandbox Code Playgroud)

适合我,但如果你不想使用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")

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


gag*_*ine 6

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

library(rstudioapi)

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

这在运行或源文件时有效。

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


Wil*_*ill 6

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

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

  • 感谢您的回答。可以通过在源代码中调用 `here::set_here()` 来利用当前脚本的位置。 (2认同)

gia*_*omo 6

setwd(this.path::here())
Run Code Online (Sandbox Code Playgroud)

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

  • 您必须先安装该软件包,您可以通过启动 `install.packages("this.path")` 来完成此操作 (2认同)

小智 5

解决方案

dirname(parent.frame(2)$ofile)
Run Code Online (Sandbox Code Playgroud)

不适合我.

我正在使用强力算法,但有效:

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)
Run Code Online (Sandbox Code Playgroud)

搜索目录时更简单:

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

  • 这个解决方案的问题是速度非常慢。搜索所有文件并存储在变量中也会占用大量内存。 (2认同)

Taz*_*Taz 5

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

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

这个对我有用。

  • pwd 代表当前工作目录。这会将目录设置为 shell 的当前目录。 (2认同)