Polecenie R do ustawiania katalogu roboczego na lokalizację pliku źródłowego w Rstudio


141

Opracowuję kilka tutoriali w R. Każdy kod R jest zawarty w określonym folderze. Tam są pliki danych i inne pliki. Chcę otworzyć .rplik i pobrać z niego źródła w taki sposób, że nie muszę zmieniać katalogu roboczego w Rstudio, jak pokazano poniżej:

wprowadź opis obrazu tutaj

Czy istnieje sposób, aby automatycznie określić mój katalog roboczy w R.


To prawdopodobnie oszustwo. zobacz?setwd ?getwd
Brandon Bertelsen


3
Nie jest to loadoszustwo , plakat chce mieć pliki .rdata w tym samym folderze, a nie sourcez katalogiem roboczym ustawionym na ścieżkę pliku źródłowego.
Ruben,

Odpowiedzi:


83

Aby uzyskać lokalizację źródła skryptu, możesz użyć utils::getSrcDirectorylub utils::getSrcFilename. Tak więc zmianę katalogu roboczego na katalog bieżącego pliku można wykonać za pomocą:

setwd(getSrcDirectory()[1])

To nie działa w RStudio jeśli Uruchom kod zamiast Źródło ing go. W tym celu musisz użyć rstudioapi::getActiveDocumentContext.

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

To drugie rozwiązanie wymaga oczywiście używania RStudio jako IDE.


Twoja własna odpowiedź na stackoverflow.com/a/35842176/1247080 działa (należy jednak podać nazwę katalogu). Dodałem to
Stat-R

Nie działa na mnie. DostajęError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru

2
Zwróć uwagę, że po uruchomieniu getActiveDocumentContext()w konsoli w programie RStudio ścieżka jest zgłaszana jako ''. Jeśli jednak uruchomisz wiersz kodu w części edytującej, zostanie on wykonany zgodnie z oczekiwaniami. Może to dotyczyć komentarza @Andru
Megatron

1
@giac_man Wygląda na to, że używasz bardzo starej wersji rstudioapipakietu. Spróbuj zaktualizować do najnowszego.
Richie Cotton

1
@mjs W górnej części konsoli powinien być widoczny bieżący katalog roboczy. Po prawej stronie jest mała strzałka. Kliknij, aby wyświetlić bieżący katalog roboczy w przeglądarce plików.
Richie Cotton

64

Wiem, że to pytanie jest nieaktualne, ale szukałem rozwiązania również na to, a Google wyświetla to na samej górze:

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

umieść to gdzieś w pliku (najlepiej jednak na początku), aby wd był zmieniany zgodnie z tym plikiem.

Zgodnie z komentarzami może to niekoniecznie działać na każdej platformie (wydaje się, że Windows działa, dla niektórych Linux / Mac). Należy pamiętać, że to rozwiązanie służy do „pozyskiwania” plików, a nie do uruchamiania fragmentów tego pliku.

zobacz także pobierz nazwę pliku i ścieżkę do pliku `source`d


101
dla mnie też nie działa:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster

4
Ten sam problem co @Matt O'Brien w systemie Linux.
patapouf_ai

4
Działa idealnie, jeśli jest pozyskiwany.
m-dz

2
Pracowałem dla mnie w RStudio v1.0.143 na Windows 10. Jeśli wybierzesz "Źródło przy zapisywaniu", będzie działać dobrze (możesz wydrukować wykryty katalog za pomocą "cat"). Jeśli wybierzesz linie, a następnie je wykonasz, wynik będzie zerowy.
Contango

2
Działa to na mnie na komputerze Mac podczas pozyskiwania pliku. Jednak, jak wskazał @Contango powyżej, nie będzie działać podczas interaktywnego wykonywania kodu, podświetlając fragment i naciskając Command + Return. W takim przypadku, ponieważ nie pozyskujesz pliku, nie ma pliku źródłowego, z którego można pobrać katalog roboczy. Odpowiedź nie musi określać zastrzeżeń dotyczących platformy.
bmosov01

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

działa dla mnie, ale jeśli nie chcesz używać rstudioapi i nie jesteś w proyect, możesz użyć symbolu ~ na swojej ścieżce. Symbol ~ odnosi się do domyślnego katalogu roboczego RStudio (przynajmniej w systemie Windows).

Opcje RStudio

Jeśli katalog roboczy RStudio to „D: / Documents”, setwd("~/proyect1") jest taki sam jak setwd ("D: / Documents / proyect1").

Gdy to ustawienie, można przejść do podkatalogu: read.csv("DATA/mydata.csv"). Jest taki sam jak read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Jeśli chcesz przejść do folderu nadrzędnego, możesz użyć "../". Na przykład: read.csv("../olddata/DATA/mydata.csv")co jest tym samym, coread.csv("D:/Documents/oldata/DATA/mydata.csv")

To dla mnie najlepszy sposób na kodowanie skryptów, niezależnie od używanego komputera.


7

W przypadku rstudio możesz automatycznie ustawić katalog roboczy na katalog skryptów za pomocą rstudioapi w ten sposób:

library(rstudioapi)

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

Działa to podczas uruchamiania lub tworzenia źródła pliku.

Najpierw musisz zainstalować pakiet rstudioapi. Zauważ, że drukuję ścieżkę, aby mieć 100% pewności, że jestem we właściwym miejscu, ale jest to opcjonalne.


Błąd w setwd (dirname (current_path)): nie można zmienić katalogu roboczego
tavalendo

@helmo sprawdź, czy twój użytkownik ma uprawnienia do zapisu w katalogu docelowym.
gagarine


5

Rozwiązanie

dirname(parent.frame(2)$ofile)

nie działa dla mnie.

Używam algorytmu brutalnej siły, ale działa:

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)

Łatwiejsze przeszukiwanie katalogu:

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

1
Problem z tym rozwiązaniem jest bardzo powolny. Wyszukiwanie wszystkich plików i przechowywanie w zmiennej również zajmuje dużo pamięci.
tavalendo

4

Jeśli pracujesz w systemie Linux, możesz spróbować tego:

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

Mi to pasuje.


1
To tylko daje twój katalog domowy (gdzie zaczyna się twoja powłoka).
Caner,

Daje ścieżkę do katalogu, w którym znajduje się uruchomiony skrypt.
Taz

2
pwd oznacza obecny katalog roboczy. Spowoduje to ustawienie katalogu na dowolny bieżący katalog powłoki.
PeterVermont

pwddziała również w PowerShell (który jest obecnie uważany za domyślną powłokę w systemie Windows), gdzie jest aliasem dla Get-Location.
BroVic

3

Właśnie szukałem rozwiązania tego problemu, trafiłem na tę stronę. Wiem, że to przestarzałe, ale poprzednie rozwiązania były dla mnie niezadowalające lub nie działały. Oto moja praca, jeśli jesteś zainteresowany.

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)

Czy jest powód, dla którego nie używasz po prostu setwd( dirname(filepath) )?
jodis

3

Zdaję sobie sprawę, że to stary wątek, ale miałem podobny problem z koniecznością ustawienia katalogu roboczego i nie mogłem sprawić, aby żadne z rozwiązań działało dla mnie. Oto, co zadziałało, na wypadek gdyby ktoś inny natknął się na to później:

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

Jest to trochę zawiłe, ale w zasadzie używa się poleceń systemowych, aby uzyskać katalog roboczy i zapisać go w dummyfile.txt, a następnie R czyta ten plik za pomocą data.table :: fread. Reszta to tylko czyszczenie tego, co zostało wydrukowane w pliku, tak że pozostaje mi tylko ścieżka do katalogu.

Musiałem uruchomić R na klastrze, więc nie było sposobu, aby dowiedzieć się, w jakim katalogu skończę (zadania otrzymują numer i węzeł obliczeniowy). To załatwiło sprawę dla mnie.


2

Rozumiem, że jest to nieaktualne, ale nie mogłem sprawić, by poprzednie odpowiedzi działały bardzo zadowalająco, więc chciałem wnieść swój wkład w moją metodę na wypadek, gdyby ktoś inny napotkał ten sam błąd, o którym mowa w komentarzach do odpowiedzi BumbleBee.

Mój jest oparty na prostym poleceniu systemowym. Wszystko, co podajesz do funkcji, to nazwa twojego skryptu:

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

Wynik funkcji wyglądałby tak "/Users/you/Path/To/Script". Mam nadzieję, że pomoże to każdemu, kto utknął.


1

herePakiet zawiera here()funkcję, która zwraca katalogu głównym projektu w oparciu o pewne heurystyki.

Nie jest to idealne rozwiązanie, ponieważ nie znajduje lokalizacji skryptu, ale do niektórych celów wystarcza, więc pomyślałem, że umieściłem to tutaj.


1
Dzięki za tę odpowiedź. Lokalizację bieżącego skryptu można wykorzystać, umieszczając wywołanie here::set_here()w źródle.
BroVic

0

Większość GUI zakłada, że ​​jeśli jesteś w katalogu i „otwierasz”, klikasz dwukrotnie lub w inny sposób próbujesz wykonać plik .R, katalog, w którym się on znajduje, będzie katalogiem roboczym, chyba że określono inaczej. Graficzny interfejs użytkownika komputera Mac zapewnia metodę zmiany tego domyślnego zachowania, które można zmienić w panelu Uruchamianie w Preferencjach ustawianych podczas bieżącej sesji i które mają obowiązywać przy następnym „uruchomieniu”. Powinieneś również przyjrzeć się:

?Startup

Dokumentacja RStudio mówi:

„Po uruchomieniu poprzez skojarzenie plików, RStudio automatycznie ustawia katalog roboczy na katalog z otwartym plikiem”. Domyślnie RStudio jest rejestrowane jako program obsługi dla plików .R, chociaż wspomina się również o możliwości ustawienia domyślnego „skojarzenia” z RStudio dla rozszerzeń .Rdata i .R. Nie mogę powiedzieć, czy status „obsługi” i „skojarzenia” są takie same w Linuksie.

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


4
Na pewno RStudio nie przyjmuje takiego założenia.
nico

1
Zachowuje się tak, jak to opisałem na moim komputerze. Nie zrobiłem nic specjalnego w preferencjach RStudio.
IRTFM

2
Nie robi tego na Linuksie :)
nico

2
Kluczowym warunkiem jest tutaj „uruchomienie przez skojarzenie plików”. Niektóre osoby mogą uruchamiać Rstudio za pomocą skrótu lub polecenia w terminalu. Musisz otworzyć plik i mieć domyślny plik Rstudio do otwierania plików .R. Jeśli najpierw otworzysz Rstudio (a następnie otworzysz plik), nie będzie działać zgodnie z opisem. Poprzez skojarzenie plików powyższa odpowiedź działa w systemie Windows i Mac (prawdopodobnie nie linux, jak wskazuje @nico - ale nie mogę tego zweryfikować, ponieważ nie mam komputera z systemem Linux).
WetlabStudent

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

dla mnie też nie działa, ale poniższe (jak zasugerowano w https://stackoverflow.com/a/35842176/992088 ) działają dla mnie w Ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)

1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'także w Ubuntu 14.04
Rich Scriven

Może możesz najpierw spróbować zainstalować pakiet rstudioapi.
Lamothy

To jest dziwne. Używam R-3.2.4 w 32-bitowym systemie Ubuntu 14.04. Mam nadzieję, że nie jest to spowodowane systemem operacyjnym lub różnymi wersjami R.
Lamothy

0

W przypadku korzystania z kodowania UTF-8:

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

Musisz zainstalować pakiet rstudioapi, jeśli jeszcze tego nie zrobiłeś.


Błąd w setwd (dirname (ścieżka)): nie można zmienić katalogu roboczego
tavalendo

`` Błąd w setwd (dirname (ścieżka)): nie można zmienić katalogu roboczego`` Twoje rozwiązanie nie działa, sprawdź odpowiedź
Mr S Coder

0

Oto inny sposób, aby to zrobić:

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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.