R для установки рабочего каталога в исходное местоположение файла в Rstudio
Я разрабатываю некоторые уроки в R. Каждый R-код содержится в определенной папке. В нем есть файлы данных и другие файлы. Я хочу открыть файл .r
и указать его так, что мне не нужно менять рабочий каталог в Rstudio, как показано ниже:
![enter image description here]()
Есть ли способ автоматически указать мой рабочий каталог в R.
Ответы
Ответ 1
Чтобы получить местоположение script, вы можете использовать utils::getSrcDirectory
или utils::getSrcFilename
. Поэтому изменение рабочего каталога на текущий файл можно выполнить с помощью
setwd(getSrcDirectory()[1])
Это не работает в RStudio, если вы запускаете код, а не его источник. Для этого вам нужно использовать rstudioapi::getActiveDocumentContext
.
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
Это второе решение требует, конечно, что вы используете RStudio в качестве среды IDE.
Ответ 2
Я знаю, что этот вопрос устарел, но я искал решение для этого, и Google перечисляет это на самом верху:
this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)
поместите это где-нибудь в файл (лучше всего было бы начало, хотя), так что wd будет изменен в соответствии с этим файлом.
Согласно комментариям, это может не обязательно работать на каждой платформе (Windows, похоже, работает, Linux/Mac для некоторых). Имейте в виду, что это решение предназначено для "поиска" файлов, не обязательно для запуска кусков в этом файле.
см. также получение имени файла и пути к файлу 'source'd
Ответ 3
Этот ответ может помочь:
script.dir <- dirname(sys.frame(1)$ofile)
Примечание: script должен быть отправлен для возврата правильного пути
Я нашел его в: https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-
Ответ BumbleBee (с parent.frame вместо sys.frame) не работал со мной, я всегда получаю сообщение об ошибке.
Ответ 4
dirname(rstudioapi::getActiveDocumentContext()$path)
работает для меня, но если вы не хотите использовать rstudioapi, и вы не находитесь в proyect, вы можете использовать символ ~ на своем пути. Символ ~ относится к рабочему каталогу RSTudio по умолчанию (по крайней мере, в Windows).
![Параметры RStudio]()
Если ваш рабочий каталог 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")
Это лучший способ для меня сценариев кода, независимо от того, какой компьютер вы используете.
Ответ 5
Для 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% уверенным, что я нахожусь в нужном месте, но это необязательно.
Ответ 6
Решение
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])
Ответ 7
Я просто искал решение этой проблемы, пришел на эту страницу. Я знаю его устаревшие, но предыдущие решения, которые были неудовлетворительными или не работали для меня. Вот моя работа, если вы заинтересованы.
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)
Ответ 8
Я понимаю, что это старый поток, но у меня была аналогичная проблема, когда мне нужно было установить рабочий каталог и не могли найти ни одно из решений для меня. Здесь то, что работало, в случае, если кто-то еще наткнется на это позже:
# 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 в кластере, поэтому не было никакого способа узнать, в какой директории я попаду (заданиям присваивается число и вычисление node). Это сделало трюк для меня.
Ответ 9
Я понимаю, что это устарело, но я не мог заставить прежние ответы работать очень удовлетворительно, поэтому я хотел внести свой вклад в мой метод, если кто-либо встретит ту же ошибку, о которой упоминалось в комментариях к ответу BumbleBee.
Шахта основана на простой системной команде. Все, что вы подаете, это имя вашего script:
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"
. Надеюсь, это поможет любому, кто, возможно, застрял.
Ответ 10
Если вы работаете в Linux, вы можете попробовать следующее:
setwd(system("pwd", intern = T) )
Это работает для меня.
Ответ 11
Большинство графических интерфейсов предполагают, что если вы находитесь в каталоге и "открываете", дважды щелкните или иным образом попытаетесь выполнить файл .R, то каталог, в котором он находится, будет рабочим каталогом, если не указано иное. Mac GUI предоставляет метод для изменения поведения по умолчанию, которое можно изменить на панели запуска Preferences, которую вы установили в текущем сеансе, и стать эффективным при следующем "запуске". Вы также должны смотреть на:
?Startup
В документации RStudio говорится:
"При запуске через ассоциацию файлов RStudio автоматически устанавливает рабочий каталог в каталог открытого файла." Настройка по умолчанию предназначена для регистрации RStudio в качестве обработчика .R файлов, хотя упоминается также возможность установить "ассоциацию" по умолчанию с RStudio для расширений .Rdata и .R. Я не могу сказать, имеет ли статус "обработчик" и статус "ассоциации" в Linux.
http://www.rstudio.com/ide/docs/using/workspaces
Ответ 12
dirname(parent.frame(2)$ofile)
тоже не работает для меня, но следующее (как предложено в fooobar.com/questions/36482/...) работает для меня в ubuntu 14.04
dirname(rstudioapi::getActiveDocumentContext()$path)
Ответ 13
Если вы используете кодировку UTF-8:
path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))
Вам нужно установить пакет rstudioapi, если вы еще этого не сделали.
Ответ 14
Пакет here
предоставляет функцию here()
, которая возвращает корневой каталог вашего проекта на основе некоторой эвристики.
Не идеальное решение, так как он не находит местоположение скрипта, но его достаточно для некоторых целей, поэтому я решил поместить его здесь.