Opracowuję kilka tutoriali w R. Każdy kod R jest zawarty w określonym folderze. Tam są pliki danych i inne pliki. Chcę otworzyć .r
plik i pobrać z niego źródła w taki sposób, że nie muszę zmieniać katalogu roboczego w Rstudio, jak pokazano poniżej:
Czy istnieje sposób, aby automatycznie określić mój katalog roboczy w R.
r
automation
working-directory
Stat-R
źródło
źródło
?setwd
?getwd
load
oszustwo , plakat chce mieć pliki .rdata w tym samym folderze, a niesource
z katalogiem roboczym ustawionym na ścieżkę pliku źródłowego.Odpowiedzi:
Aby uzyskać lokalizację źródła skryptu, możesz użyć
utils::getSrcDirectory
lubutils::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
.To drugie rozwiązanie wymaga oczywiście używania RStudio jako IDE.
źródło
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
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 @Andrurstudioapi
pakietu. Spróbuj zaktualizować do najnowszego.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
źródło
Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
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).
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 jakread.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.
źródło
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.
źródło
Ta odpowiedź może pomóc:
script.dir <- dirname(sys.frame(1)$ofile)
Znalazłem to w: https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-
Odpowiedź BumbleBee (z parent.frame zamiast sys.frame) nie zadziałała, zawsze otrzymuję błąd.
źródło
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])
źródło
Jeśli pracujesz w systemie Linux, możesz spróbować tego:
setwd(system("pwd", intern = T) )
Mi to pasuje.
źródło
pwd
działa również w PowerShell (który jest obecnie uważany za domyślną powłokę w systemie Windows), gdzie jest aliasem dlaGet-Location
.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)
źródło
setwd( dirname(filepath) )
?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.
źródło
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ął.źródło
here
Pakiet zawierahere()
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.
źródło
here::set_here()
w źródle.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ę:
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
źródło
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
źródło
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
także w Ubuntu 14.04W 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ś.
źródło
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()
źródło