簡體   English   中英

用於在 Rstudio 中將工作目錄設置為源文件位置的 R 命令

[英]R command for setting working directory to source file location in Rstudio

我正在用 R 編寫一些教程。每個 R 代碼都包含在一個特定的文件夾中。 里面有數據文件和其他文件。 我想打開.r文件並獲取它,這樣我就不必更改 Rstudio 中的工作目錄,如下所示:

在此處輸入圖像描述

有沒有辦法在 R 中自動指定我的工作目錄。

要獲取源腳本的位置,您可以使用utils::getSrcDirectoryutils::getSrcFilename 因此,可以通過以下方式將工作目錄更改為當前文件的工作目錄:

setwd(getSrcDirectory()[1])

如果您運行代碼而不是Source ,這在 RStudio 中不起作用。 為此,您需要使用rstudioapi::getActiveDocumentContext

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

當然,第二種解決方案要求您使用 RStudio 作為 IDE。

我知道這個問題已經過時了,但我也在尋找解決方案,谷歌將其列在最上面:

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

將其放入文件的某處(不過最好是開頭),以便根據該文件更改 wd。

根據評論,這可能不一定適用於每個平台(Windows 似乎可以,Linux/Mac 對某些平台有效)。 請記住,此解決方案用於“采購”文件,不一定用於在該文件中運行塊。

另見獲取 `source`d 文件的文件名和路徑

對於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% 確定我在正確的位置,但這是可選的。

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")相同

這是我編寫腳本的最佳方式,無論您使用的是什么計算機。

我意識到這是一個舊線程,但我遇到了類似的問題,需要設置工作目錄並且無法獲得任何適合我的解決方案。 這是有效的方法,以防其他人以后偶然發現:

# 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,因此無法知道我最終會進入哪個目錄(作業被分配了一個編號和一個計算節點)。 這對我有用。

這個答案可以幫助:

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)對我不起作用,我總是會出錯。

解決方案

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

如果你在 Linux 上工作,你可以試試這個:

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

這個對我有用。

here包提供了here()函數,它會根據一些啟發式方法返回您的項目根目錄。

不是完美的解決方案,因為它找不到腳本的位置,但它足以滿足某些目的,所以我想我會把它放在這里。

我知道這已經過時了,但我無法讓以前的答案非常令人滿意地工作,所以我想貢獻我的方法,以防其他人遇到與 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" 希望這可以幫助其他可能被卡住的人。

setwd(this.path::here())

適用於來源腳本和“活動”腳本。

我只是在尋找這個問題的解決方案,來到這個頁面。 我知道它過時了,但以前的解決方案對我來說不令人滿意或不起作用。 如果有興趣,這是我的解決方法。

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)

我覺得自己像一只反舌鳥,但我要說的是:我知道這篇文章很舊,但是......

我最近才知道從任務計划程序和 a.bat 文件運行腳本時無法調用 api。 我經過慘痛的教訓才學到這個。 methods might like to know that.我想那些使用方法的人可能想知道這一點。 我們一夜之間以這種方式運行了很多腳本。 最近剛剛更改了我們的路徑以包含調用的 api,因此我們可以“動態”設置工作目錄。 然后,當我們嘗試的第一個失敗時從任務計划程序觸發時,調查提供了有關的信息。

這是揭示此問題的實際代碼:

不過,如果您正在運行腳本,效果會很好!

只需添加我的兩分錢,因為我知道人們仍然會拉起這些線程,認為這可能會有所幫助。

如果您使用 UTF-8 編碼:

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

如果您還沒有安裝包 rstudioapi,則需要安裝它。

大多數 GUI 假設如果您在一個目錄中並“打開”、雙擊或以其他方式嘗試執行一個 .R 文件,除非另有說明,否則它所在的目錄將是工作目錄。 Mac GUI 提供了一種更改默認行為的方法,該默認行為可在您在運行會話中設置的首選項的啟動面板中更改,並在下一次“啟動”時生效。 你還應該看看:

?Startup

RStudio 文檔說:

“通過文件關聯啟動時,RStudio 會自動將工作目錄設置為打開文件的目錄。” 默認設置是將 RStudio 注冊為 .R 文件的處理程序,盡管也提到了為 .Rdata 和 .R 擴展設置與 RStudio 的默認“關聯”的能力。 我不知道在 Linux 上具有“處理程序”狀態和“關聯”狀態是否相同。

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

dirname(parent.frame(2)$ofile)  

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

dirname(rstudioapi::getActiveDocumentContext()$path)

這是另一種方法:

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

我正在用R編寫一些教程。每個R代碼都包含在一個特定的文件夾中。 那里有數據文件和其他文件。 我想打開.r文件並將其來源,這樣我就不必更改Rstudio中的工作目錄,如下所示:

在此處輸入圖片說明

有沒有一種方法可以在R中自動指定我的工作目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM