[英]R command for setting working directory to source file location in Rstudio
我正在用 R 編寫一些教程。每個 R 代碼都包含在一個特定的文件夾中。 里面有數據文件和其他文件。 我想打開.r
文件並獲取它,這樣我就不必更改 Rstudio 中的工作目錄,如下所示:
有沒有辦法在 R 中自動指定我的工作目錄。
要獲取源腳本的位置,您可以使用utils::getSrcDirectory
或utils::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 對某些平台有效)。 請記住,此解決方案用於“采購”文件,不一定用於在該文件中運行塊。
對於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 工作目錄是“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 上具有“處理程序”狀態和“關聯”狀態是否相同。
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.