Perintah R untuk mengatur direktori kerja ke sumber file lokasi di Rstudio

135

Saya mengerjakan beberapa tutorial dalam R. Setiap kode R terkandung dalam folder tertentu. Ada file data dan file lain di sana. Saya ingin membuka .rfile dan sumbernya sehingga saya tidak perlu mengubah direktori kerja di Rstudio seperti yang ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Apakah ada cara untuk menentukan direktori kerja saya secara otomatis di R.

Stat-R
sumber
Ini mungkin sebuah penipuan. lihat?setwd ?getwd
Brandon Bertelsen
3
Bukan duplikat, poster ingin loadfile .rdata di folder yang sama, tidak sourcedengan direktori kerja diatur ke jalur file yang bersumber.
Ruben

Jawaban:

76

Untuk mendapatkan lokasi sumber skrip, Anda dapat menggunakan utils::getSrcDirectoryatau utils::getSrcFilename. Jadi mengubah direktori kerja ke file saat ini dapat dilakukan dengan:

setwd(getSrcDirectory()[1])

Ini tidak berfungsi di RStudio jika Anda Menjalankan kode dan bukannya Sumbernya . Untuk itu, Anda perlu menggunakan rstudioapi::getActiveDocumentContext.

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

Solusi kedua ini mengharuskan Anda menggunakan RStudio sebagai IDE Anda, tentu saja.

Richie Cotton
sumber
jawaban Anda sendiri di stackoverflow.com/a/35842176/1247080 berfungsi (orang harus menyertakan dirname). Saya menambahkannya
Stat-R
Tidak bekerja untuk saya. Saya mendapatkanError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru
2
Perhatikan bahwa ketika Anda menjalankan getActiveDocumentContext()konsol di dalam RStudio, lintasan dilaporkan sebagai ''. Namun, jika Anda menjalankan baris kode di bagian editor, itu akan dieksekusi seperti yang diharapkan. Ini dapat membahas komentar @ndru
Megatron
1
@giac_man Sepertinya Anda menggunakan versi rstudioapipaket yang sangat lama . Coba perbarui ke yang terbaru.
Richie Cotton
1
@ mjs Di bagian atas konsol, Anda akan melihat direktori kerja saat ini. Di sebelah kanannya ada panah kecil. Klik itu untuk menampilkan direktori aktif saat ini di browser file.
Richie Cotton
62

Saya tahu pertanyaan ini sudah usang, tetapi saya juga mencari solusi untuk itu dan Google mencantumkan ini di bagian paling atas:

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

letakkan di suatu tempat ke dalam file (yang terbaik adalah permulaan), sehingga wd diubah sesuai dengan file itu.

Menurut komentar, ini mungkin belum tentu berfungsi pada setiap platform (Windows tampaknya berfungsi, Linux / Mac untuk beberapa). Perlu diingat bahwa solusi ini adalah untuk 'sumber' file, tidak harus untuk menjalankan potongan dalam file itu.

lihat juga dapatkan nama file dan jalur file `source`d

Kumbang
sumber
99
juga tidak bekerja untuk saya:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster
4
Masalah yang sama di sini sebagai @Matt O'Brien di Linux.
patapouf_ai
3
Bekerja dengan sempurna jika bersumber.
m-dz
2
Bekerja untuk saya di RStudio v1.0.143 di Windows 10. Jika Anda memilih "Source on save", itu akan berfungsi dengan baik (Anda dapat mencetak direktori yang terdeteksi dengan "cat"). Jika Anda memilih garis kemudian jalankan, maka hasilnya adalah nol.
Contango
2
Ini berfungsi untuk saya di Mac saat sumber file. Namun, seperti yang ditunjukkan @Contango di atas, itu tidak akan berfungsi ketika menjalankan kode secara interaktif dengan menyorot potongan dan menekan Command + Return. Dalam hal ini, karena Anda tidak mencari file, tidak ada file sumber untuk menarik direktori kerja. Jawabannya tidak perlu menentukan peringatan khusus platform.
bmosov01
7
dirname(rstudioapi::getActiveDocumentContext()$path)

berfungsi untuk saya tetapi jika Anda tidak ingin menggunakan rstudioapi dan Anda tidak dalam proyect, Anda dapat menggunakan simbol ~ di jalur Anda. Simbol ~ merujuk ke direktori kerja RStudio default (setidaknya pada Windows).

Opsi RStudio

Jika direktori kerja RStudio Anda adalah "D: / Documents", setwd("~/proyect1") sama dengan setwd ("D: / Documents / proyect1").

Setelah Anda mengaturnya, Anda dapat menavigasi ke subdirektori: read.csv("DATA/mydata.csv") . Apakah sama dengan read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Jika Anda ingin menavigasi ke folder induk, Anda dapat menggunakan "../" . Sebagai contoh: read.csv("../olddata/DATA/mydata.csv")yang sama denganread.csv("D:/Documents/oldata/DATA/mydata.csv")

Ini adalah cara terbaik bagi saya untuk membuat kode skrip, apa pun komputer yang Anda gunakan.

Juan Pueyo
sumber
6

Untuk rstudio , Anda dapat secara otomatis mengatur direktori kerja Anda ke direktori skrip menggunakan rstudioapi seperti itu:

library(rstudioapi)

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

Ini berfungsi saat Menjalankan atau Sumber file Anda.

Anda harus menginstal paket rstudioapi terlebih dahulu. Perhatikan bahwa saya mencetak path untuk 100% yakin saya di tempat yang tepat, tetapi ini opsional.

gagarine
sumber
Kesalahan dalam setwd (dirname (current_path)): tidak dapat mengubah direktori kerja
tavalendo
@helmo memeriksa pengguna Anda memiliki izin menulis di direktori target.
gagarine
5

Solusinya

dirname(parent.frame(2)$ofile)

tidak bekerja untukku.

Saya menggunakan algoritma brute force, tetapi berfungsi:

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)

Lebih mudah saat mencari direktori:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])
namu.net
sumber
1
Masalah dengan solusi ini adalah sangat lambat. Mencari semua file dan menyimpan dalam variabel juga membutuhkan banyak memori.
tavalendo
4

Jika Anda bekerja di Linux, Anda dapat mencoba ini:

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

Ini bekerja untuk saya.

Taz
sumber
1
Ini hanya memberikan direktori home Anda (tempat shell Anda mulai).
Caner
Ini memberi jalan ke direktori tempat skrip Anda jalankan.
Taz
2
pwd adalah singkatan dari direct working directory. Ini akan mengatur direktori ke apa pun direktori shell saat ini.
PeterVermont
pwdjuga berfungsi di PowerShell (yang saat ini dianggap sebagai shell default pada Windows), yang merupakan alias untuk Get-Location.
BroVic
3

Saya hanya mencari solusi untuk masalah ini, datang ke halaman ini. Saya tahu ini tanggal tetapi solusi sebelumnya di mana tidak memuaskan atau tidak bekerja untuk saya. Inilah pekerjaan saya jika tertarik.

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)
Ryan Liebert
sumber
Apakah ada alasan mengapa Anda tidak hanya menggunakan setwd( dirname(filepath) )?
jodis
3

Saya menyadari bahwa ini adalah utas lama, tetapi saya memiliki masalah yang sama dengan perlu mengatur direktori kerja dan tidak bisa mendapatkan salah satu solusi untuk saya. Inilah yang berhasil, kalau-kalau ada orang yang tersandung di kemudian hari:

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

Agak berbelit-belit, tetapi pada dasarnya ini menggunakan perintah sistem untuk mendapatkan direktori kerja dan menyimpannya ke dummyfile.txt, kemudian R membaca file itu menggunakan data.table :: fread. Sisanya hanya membersihkan apa yang telah dicetak ke file sehingga saya hanya memiliki jalur direktori.

Saya perlu menjalankan R pada sebuah cluster, jadi tidak ada cara untuk mengetahui direktori apa yang akan saya tuju (pekerjaan akan diberi nomor dan node komputasi). Ini berhasil bagi saya.

Katie Renwick
sumber
2

Saya mengerti ini sudah ketinggalan zaman, tetapi saya tidak bisa mendapatkan jawaban sebelumnya untuk bekerja dengan sangat memuaskan, jadi saya ingin berkontribusi metode saya jika ada orang lain yang menemukan kesalahan yang sama yang disebutkan dalam komentar untuk jawaban BumbleBee.

Milik saya didasarkan pada perintah sistem sederhana. Yang Anda beri makan fungsi adalah nama skrip Anda:

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

Output dari fungsi akan terlihat seperti "/Users/you/Path/To/Script". Semoga ini bisa membantu orang lain yang mungkin terjebak.

Tgsmith61591
sumber
1

The herepaket menyediakan here()fungsi, yang mengembalikan direktori root proyek Anda berdasarkan beberapa heuristik.

Bukan solusi yang sempurna, karena tidak menemukan lokasi skrip, tetapi cukup untuk beberapa tujuan jadi saya pikir saya akan meletakkannya di sini.

Akan
sumber
1
Terima kasih atas jawaban ini. Lokasi skrip saat ini dapat dimanfaatkan dengan menempatkan panggilan ke here::set_here()dalam sumber.
BroVic
0

Sebagian besar GUI berasumsi bahwa jika Anda berada di direktori dan "buka", klik dua kali, atau coba jalankan file .R, direktori di mana ia berada akan menjadi direktori yang berfungsi kecuali ditentukan lain. GUI Mac menyediakan metode untuk mengubah perilaku default yang dapat diubah di panel Startup Preferensi yang Anda tetapkan dalam sesi berjalan dan menjadi efektif di "startup" berikutnya. Anda juga harus melihat:

?Startup

Dokumentasi RStudio mengatakan:

"Ketika diluncurkan melalui asosiasi file, RStudio secara otomatis menetapkan direktori kerja ke direktori file yang dibuka." Pengaturan default adalah agar RStudio didaftarkan sebagai penangan untuk file .R, meskipun ada juga menyebutkan kemampuan untuk mengatur "asosiasi" default dengan RStudio untuk ekstensi .Rdata dan .R. Apakah memiliki status 'penangan' dan status 'asosiasi' sama di Linux, saya tidak tahu.

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

IRTFM
sumber
4
Pasti RStudio tidak membuat asumsi itu.
nico
1
Itu berperilaku seperti yang saya jelaskan di mesin saya. Saya belum melakukan sesuatu yang istimewa pada Preferensi RStudio.
IRTFM
2
Tidak melakukan itu di Linux :)
nico
2
"Ketika diluncurkan melalui asosiasi file" adalah syarat utama di sini. Beberapa orang mungkin meluncurkan Rstudio melalui jalan pintas atau perintah di terminal. Anda perlu membuka file dan memiliki default untuk membuka file .R menjadi Rstudio. Jika Anda membuka Rstudio terlebih dahulu (lalu buka file) itu tidak akan berfungsi seperti yang dijelaskan. Melalui asosiasi file, jawaban di atas berfungsi di windows dan mac (mungkin bukan linux seperti yang ditunjukkan @nico - tapi saya tidak dapat memverifikasi ini karena saya tidak memiliki mesin linux).
WetlabStudent
0
dirname(parent.frame(2)$ofile)  

juga tidak bekerja untuk saya, tetapi yang berikut (seperti yang disarankan dalam https://stackoverflow.com/a/35842176/992088 ) berfungsi untuk saya di ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)
Lamothy
sumber
1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'juga di Ubuntu 14,04
Rich Scriven
Mungkin Anda dapat mencoba menginstal paket rstudioapi terlebih dahulu.
Lamothy
Itu aneh. Saya menggunakan R-3.2.4 di Ubuntu 32-bit 14,04. Saya harap itu bukan karena sistem operasi atau versi yang berbeda dari R.
Lamothy
0

Jika Anda menggunakan pengkodean UTF-8:

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

Anda perlu menginstal paket rstudioapi jika Anda belum melakukannya.

jormaga
sumber
Kesalahan dalam setwd (dirname (path)): tidak dapat mengubah direktori kerja
tavalendo
`` `Kesalahan dalam setwd (dirname (path)): tidak dapat mengubah direktori kerja`` solusi Anda tidak berfungsi, periksa jawaban Anda
Mr S Coder
0

Berikut cara lain untuk melakukannya:

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