Lệnh R để đặt thư mục làm việc vào vị trí tệp nguồn trong Rstudio


135

Tôi đang thực hiện một số hướng dẫn trong R. Mỗi mã R được chứa trong một thư mục cụ thể. Có tệp dữ liệu và các tệp khác trong đó. Tôi muốn mở .rtệp và nguồn nó sao cho tôi không phải thay đổi thư mục làm việc trong Rstudio như dưới đây:

nhập mô tả hình ảnh ở đây

Có cách nào để chỉ định thư mục làm việc của tôi tự động trong R.


Đây có lẽ là một bản dupe. xem?setwd ?getwd
Brandon Bertelsen


3
Không phải là bản sao, người đăng muốn loadcác tệp .rdata trong cùng một thư mục, không phải sourcevới thư mục làm việc được đặt thành đường dẫn của tệp có nguồn gốc.
Ruben

Câu trả lời:


76

Để có được vị trí của tập lệnh đang có nguồn gốc, bạn có thể sử dụng utils::getSrcDirectoryhoặc utils::getSrcFilename. Vì vậy, việc thay đổi thư mục làm việc thành tệp hiện tại có thể được thực hiện với:

setwd(getSrcDirectory()[1])

Điều này không hoạt động trong RStudio nếu bạn Chạy mã chứ không phải Nguồn ing. Đối với điều đó, bạn cần phải sử dụng rstudioapi::getActiveDocumentContext.

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

Giải pháp thứ hai này yêu cầu rằng bạn đang sử dụng RStudio làm IDE của mình, tất nhiên.


câu trả lời của riêng bạn tại stackoverflow.com/a353842176/1247080 hoạt động (mặc dù phải bao gồm tên thư mục). Tôi đã thêm nó
Stat-R

Không làm việc cho tôi. Tôi nhận đượcError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru

2
Lưu ý rằng khi bạn chạy getActiveDocumentContext()trong bảng điều khiển trong RStudio, đường dẫn được báo cáo là ''. Tuy nhiên, nếu bạn chạy dòng mã trong phần soạn thảo, nó sẽ thực thi như mong đợi. Điều này có thể giải quyết nhận xét của @Andru
Megatron

1
@giac_man Có vẻ như bạn đang sử dụng một phiên bản rất cũ của rstudioapigói. Hãy thử cập nhật lên bản mới nhất.
Richie Cotton

1
@mjs Ở đầu bảng điều khiển, bạn sẽ thấy thư mục làm việc hiện tại. Bên phải là một mũi tên nhỏ. Nhấn vào đó để hiển thị thư mục làm việc hiện tại trong trình duyệt tập tin.
Bông Richie

62

Tôi biết câu hỏi này đã lỗi thời, nhưng tôi cũng đang tìm kiếm một giải pháp cho điều đó và Google liệt kê câu hỏi này ở đầu trang:

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

đặt nó ở đâu đó vào tập tin (tốt nhất sẽ là khởi đầu), để wd được thay đổi theo tập tin đó.

Theo các bình luận, điều này có thể không nhất thiết phải hoạt động trên mọi nền tảng (Windows dường như hoạt động, Linux / Mac đối với một số người). Hãy nhớ rằng giải pháp này là để 'tìm nguồn' các tệp, không nhất thiết phải chạy các đoạn trong tệp đó.

xem thêm lấy tên tệp và đường dẫn của tệp `source`d


99
cũng không làm việc cho tôi:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster

4
Vấn đề tương tự ở đây là @Matt O'Brien trên Linux.
patapouf_ai

3
Làm việc hoàn hảo nếu có nguồn gốc.
m-dz

2
Làm việc cho tôi trong RStudio v1.0.143 trên Windows 10. Nếu bạn chọn "Nguồn khi lưu", nó sẽ hoạt động tốt (bạn có thể in ra thư mục được phát hiện bằng "cat"). Nếu bạn chọn các dòng thì thực hiện chúng, thì kết quả là null.
Contango

2
Điều này làm việc cho tôi trên máy Mac khi tìm nguồn cung cấp tệp. Tuy nhiên, như @Contango đã chỉ ra ở trên, nó sẽ không hoạt động khi thực thi mã tương tác bằng cách làm nổi bật một đoạn và nhấn Command + Return. Trong trường hợp này, vì bạn không tìm nguồn cung cấp một tệp, không có tệp nguồn để lấy thư mục làm việc từ đó. Câu trả lời không cần chỉ định cảnh báo cụ thể nền tảng.
bmosov01

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

hoạt động với tôi nhưng nếu bạn không muốn sử dụng rstudioapi và bạn không ở trong một proyect, bạn có thể sử dụng biểu tượng ~ trong đường dẫn của mình. Biểu tượng ~ đề cập đến thư mục làm việc RStudio mặc định (ít nhất là trên Windows).

Tùy chọn RStudio

Nếu thư mục làm việc RStudio của bạn là "D: / Documents", setwd("~/proyect1")giống như setwd ("D: / Documents / proyect1").

Khi bạn đặt điều đó, bạn có thể điều hướng đến thư mục con : read.csv("DATA/mydata.csv"). Cũng giống như read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Nếu bạn muốn điều hướng đến một thư mục cha, bạn có thể sử dụng "../". Ví dụ: read.csv("../olddata/DATA/mydata.csv")giống nhưread.csv("D:/Documents/oldata/DATA/mydata.csv")

Đây là cách tốt nhất để tôi viết mã script, bất kể bạn đang sử dụng máy tính nào.



6

Đối với rstudio , bạn có thể tự động đặt thư mục làm việc của mình vào thư mục tập lệnh bằng cách sử dụng rstudioapi như thế:

library(rstudioapi)

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

Điều này hoạt động khi Chạy hoặc Nguồn tệp của bạn.

Bạn cần cài đặt gói rstudioapi trước. Lưu ý rằng tôi in đường dẫn để chắc chắn 100% tôi đang ở đúng nơi, nhưng đây là tùy chọn.


Lỗi trong setwd (dirname (current_path)): không thể thay đổi thư mục làm việc
tavalendo

@helmo kiểm tra người dùng của bạn có quyền ghi trên thư mục đích.
gagarine

5

Giải pháp

dirname(parent.frame(2)$ofile)

không làm việc cho tôi

Tôi đang sử dụng thuật toán vũ phu, nhưng hoạt động:

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)

Dễ dàng hơn khi tìm kiếm một thư mục:

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

1
Vấn đề với giải pháp này là rất chậm. Tìm kiếm tất cả các tệp và lưu trữ trong một biến cũng chiếm rất nhiều bộ nhớ.
tavalendo

4

Nếu bạn làm việc trên Linux, bạn có thể thử điều này:

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

Nó làm việc cho tôi.


1
Điều này chỉ cung cấp cho thư mục nhà của bạn (nơi vỏ của bạn bắt đầu).
Caner

Nó đưa đường dẫn đến thư mục nơi tập lệnh bạn chạy.
Taz

2
pwd là viết tắt của thư mục làm việc hiện tại. Điều này sẽ đặt thư mục thành bất cứ thư mục hiện tại của shell.
PeterVermont

pwdcũng hoạt động trong PowerShell (hiện được coi là hệ vỏ mặc định trên Windows), nơi đây là bí danh Get-Location.
BroVic

3

Tôi chỉ tìm kiếm một giải pháp cho vấn đề này, đã đến trang này. Tôi biết ngày đó nhưng các giải pháp trước đây không thỏa mãn hoặc không phù hợp với tôi. Đây là công việc của tôi xung quanh nếu quan tâm.

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)

Có một lý do tại sao bạn không chỉ sử dụng setwd( dirname(filepath) )?
jodis

3

Tôi nhận ra rằng đây là một chủ đề cũ, nhưng tôi có một vấn đề tương tự với việc cần phải thiết lập thư mục làm việc và không thể có bất kỳ giải pháp nào hoạt động cho tôi. Đây là những gì đã làm, trong trường hợp bất cứ ai khác tình cờ gặp điều này sau này:

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

Nó hơi phức tạp, nhưng về cơ bản, điều này sử dụng các lệnh hệ thống để lấy thư mục làm việc và lưu nó vào dummyfile.txt, sau đó R đọc tệp đó bằng data.table :: fread. Phần còn lại chỉ là dọn dẹp những gì đã được in vào tệp để tôi chỉ còn lại đường dẫn thư mục.

Tôi cần chạy R trên một cụm, vì vậy không có cách nào để biết thư mục nào tôi kết thúc (công việc được gán một số và một nút tính toán). Điều này đã lừa tôi.


2

Tôi hiểu điều này đã lỗi thời, nhưng tôi không thể làm cho các câu trả lời trước hoạt động rất thỏa đáng, vì vậy tôi muốn đóng góp phương pháp của mình trong trường hợp bất kỳ ai khác gặp phải lỗi tương tự được đề cập trong các nhận xét cho câu trả lời của BumbleBee.

Của tôi dựa trên một lệnh hệ thống đơn giản. Tất cả những gì bạn cung cấp cho hàm là tên tập lệnh của bạn:

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"));

Đầu ra từ hàm sẽ như thế nào "/Users/you/Path/To/Script". Hy vọng điều này sẽ giúp bất cứ ai khác có thể đã bị mắc kẹt.


1

Các heregói cung cấp các here()chức năng, trong đó trả về thư mục gốc của dự án của bạn dựa trên một số chẩn đoán.

Không phải là giải pháp hoàn hảo, vì nó không tìm thấy vị trí của tập lệnh, nhưng nó đủ cho một số mục đích nên tôi nghĩ tôi đã đặt nó ở đây.


1
Cảm ơn câu trả lời này. Vị trí của tập lệnh hiện tại có thể được khai thác bằng cách thực hiện cuộc gọi đến here::set_here()nguồn.
BroVic

0

Hầu hết các GUI cho rằng nếu bạn đang ở trong một thư mục và "mở", bấm đúp hoặc cố gắng thực thi tệp .R, thì thư mục chứa nó sẽ là thư mục làm việc trừ khi có quy định khác. GUI Mac cung cấp một phương pháp để thay đổi hành vi mặc định đó có thể thay đổi trong bảng Khởi động Tùy chọn mà bạn đã đặt trong phiên chạy và có hiệu lực ở lần "khởi động" tiếp theo. Bạn cũng nên xem xét:

?Startup

Tài liệu RStudio nói:

"Khi được khởi chạy thông qua liên kết tệp, RStudio sẽ tự động đặt thư mục làm việc vào thư mục của tệp đã mở." Thiết lập mặc định dành cho RStudio để được đăng ký làm trình xử lý cho các tệp .R, mặc dù cũng có đề cập đến khả năng đặt "liên kết" mặc định với RStudio cho các phần mở rộng .Rdata và .R. Cho dù trạng thái 'xử lý' và trạng thái 'liên kết' có giống nhau trên Linux hay không, tôi không thể biết được.

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


4
Để chắc chắn RStudio không đưa ra giả định đó.
nico

1
Nó hoạt động theo cách tôi mô tả nó trên máy của tôi. Tôi chưa làm gì đặc biệt cho RStudio Preferences.
IRTFM

2
Không làm điều đó trên Linux :)
nico

2
"Khi được khởi chạy thông qua liên kết tệp" là điều kiện chính ở đây. Một số người có thể khởi chạy Rstudio thông qua phím tắt hoặc lệnh trong thiết bị đầu cuối. Bạn cần mở tệp và có mặc định để mở tệp .R là Rstudio. Nếu bạn mở Rstudio trước (sau đó mở tệp) thì nó sẽ không hoạt động như mô tả. Thông qua liên kết tệp, câu trả lời ở trên hoạt động trong windows và mac (có thể không phải là linux như @nico chỉ ra - nhưng tôi không thể xác minh điều này vì tôi không có máy linux).
WetlabStudent

0
dirname(parent.frame(2)$ofile)  

cũng không hoạt động với tôi, nhưng những điều sau đây (như được đề xuất trong https://stackoverflow.com/a353842176/992088 ) hoạt động với tôi trong ubfox 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)

1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'cũng trong Ubuntu 14.04
Rich Scriven

Có lẽ bạn có thể thử cài đặt gói rstudioapi trước.
Lamothy

Điều đó thật lạ. Tôi đang sử dụng R-3.2.4 trong Ubuntu 14.04 32 bit. Tôi hy vọng không phải vì hệ điều hành hay các phiên bản khác nhau của R.
Lamothy

0

Trong trường hợp bạn sử dụng mã hóa UTF-8:

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

Bạn cần cài đặt gói rstudioapi nếu bạn chưa thực hiện.


Lỗi trong setwd (dirname (đường dẫn)): không thể thay đổi thư mục làm việc
tavalendo

`` `Error in setwd (dirname (path)): không thể thay đổi thư mục làm việc 'giải pháp của bạn không hoạt động, vui lòng kiểm tra câu trả lời của bạn
Mr S Coder

0

Đây là một cách khác để làm điều đó:

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.