Команда R для установки рабочего каталога в расположение исходного файла в Rstudio
Я работаю над некоторыми учебниками на R. Каждый код R содержится в определенной папке. Там есть файлы данных и другие файлы. Я хочу открыть .r
файл и исходный код, так что мне не нужно менять рабочий каталог в Rstudio, как показано ниже:
Есть ли способ указать мой рабочий каталог автоматически в R.
18 ответов
Я знаю, что этот вопрос устарел, но я также искал решение для этого, и Google перечисляет это в самом верху:
this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)
поместите это где-нибудь в файл (лучше всего было бы начало, хотя), так что wd изменяется в соответствии с этим файлом.
Согласно комментариям, это может не обязательно работать на каждой платформе (Windows, кажется, работает, Linux/Mac для некоторых). Имейте в виду, что это решение предназначено для поиска файлов, а не для запуска фрагментов в этом файле.
смотрите также получить имя файла и путь к файлу `source`d
Чтобы получить местоположение источника скрипта, вы можете использовать utils::getSrcDirectory
или же utils::getSrcFilename
, Таким образом, изменение рабочего каталога на текущий файл может быть выполнено с помощью:
setwd(getSrcDirectory()[1])
Это не работает в RStudio, если вы запускаете код, а не его исходный код. Для этого вам нужно использовать rstudioapi::getActiveDocumentContext
,
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
Второе решение требует, чтобы вы использовали RStudio в качестве вашей IDE, конечно.
Если вы используете 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% уверенным, что я в нужном месте, но это не обязательно.
dirname(rstudioapi::getActiveDocumentContext()$path)
работает для меня, но если вы не хотите использовать rstudioapi и у вас нет проекта, вы можете использовать символ ~ на своем пути. Символ ~ обозначает рабочий каталог RStudio по умолчанию (по крайней мере, в Windows).
Если ваш рабочий каталог 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")
Это лучший способ для меня писать сценарии независимо от того, какой компьютер вы используете.
Я понимаю, что это старая ветка, но у меня была похожая проблема с необходимостью установить рабочий каталог, и я не смог заставить ни одно из решений работать на меня. Вот что сработало на тот случай, если кто-нибудь еще наткнется на это позже:
# 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 в кластере, поэтому не было никакого способа узнать, в каком каталоге я окажусь (заданиям присваиваются номер и вычислительный узел). Это помогло мне.
Этот ответ может помочь:
script.dir <- dirname(sys.frame(1)$ofile)
Примечание: сценарий должен быть получен, чтобы вернуть правильный путь
Я нашел это в: https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-
Ответ BumbleBee (с parent.frame вместо sys.frame) не работал для меня, я всегда получаю сообщение об ошибке.
setwd(this.path::here())
работает как для исходных, так и для «активных» сценариев.
В here
пакет предоставляет here()
функция, которая возвращает корневой каталог вашего проекта на основе некоторой эвристики.
Не идеальное решение, так как он не находит местоположение сценария, но для некоторых целей его достаточно, поэтому я подумал, что поместил его здесь.
Если вы работаете в Linux, вы можете попробовать это:
setwd(system("pwd", intern = T) )
Меня устраивает.
Решение
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])
Я понимаю, что это устарело, но я не мог заставить прежние ответы работать очень удовлетворительно, поэтому я хотел внести свой метод в случае, если кто-то еще столкнется с той же ошибкой, упомянутой в комментариях к ответу BumbleBee.
Мой основан на простой системной команде. Все, что вы кормите функцию - это имя вашего скрипта:
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"
, Надеюсь, что это поможет любому, кто мог застрять.
Я просто искал решение этой проблемы, зашел на эту страницу. Я знаю, что оно датировано, но предыдущие решения были неудовлетворительными или не помогли мне. Вот моя работа, если интересно.
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)
Если вы используете кодировку UTF-8:
path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))
Вам необходимо установить пакет rstudioapi, если вы еще этого не сделали.
Я чувствую себя пересмешником, но я скажу это: я знаю, что этот пост старый, но...
Я только недавно узнал, что вы не можете вызывать API при запуске скрипта из планировщика заданий и файла .bat. Я научился этому на собственном горьком опыте. Думаю, тем из вас, кто использовал какой-либо из методов rstudioapi:: , может быть интересно это узнать. Мы запускаем множество скриптов таким образом за одну ночь. Совсем недавно мы изменили наш путь, чтобы включить вызываемый API, чтобы мы могли «динамически» установить рабочий каталог. Затем, когда первая попытка, с которой мы попытались, потерпела неудачу при запуске из планировщика заданий, расследование принесло эту информацию.
Это фактический код, который выявил эту проблему:
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
Однако работает прекрасно, если вы запускаете скрипт!
Просто добавлю свои два цента, поскольку я знаю, что люди все еще поднимают эти темы, подумал, что это может быть полезно.
Опираясь на @Richie Cotton's, если вы используете RStudio, вот фрагмент, который установит рабочий каталог для текущего сценария в каждом случае исходного кода, запуска или вязания сценария:
# Change WD to current file
# - source and knit
srcdir <- getSrcDirectory(function(){})[1]
if (srcdir=="") {
# - run
srcdir <- dirname(rstudioapi::getActiveDocumentContext()$path)
}
setwd(srcdir)
rm(srcdir)
Большинство графических интерфейсов предполагают, что если вы находитесь в каталоге и "открываете", дважды щелкаете или иным образом пытаетесь выполнить файл.R, то каталог, в котором он находится, будет рабочим, если не указано иное. Графический интерфейс Mac предоставляет метод для изменения поведения по умолчанию, которое можно изменить на панели "Автозагрузка" настроек, которые вы установили в текущем сеансе и вступили в силу при следующем "запуске". Вы должны также смотреть на:
?Startup
Документация RStudio гласит:
"При запуске через файловую ассоциацию RStudio автоматически устанавливает рабочий каталог в каталог открытого файла". По умолчанию RStudio регистрируется в качестве обработчика для файлов.R, хотя также упоминается возможность установки "ассоциации" по умолчанию с RStudio для расширений.Rdata и.R. Я не могу сказать, имеют ли статус "обработчик" и "связь" статус в Linux.
Вот еще один способ сделать это:
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()
dirname(parent.frame(2)$ofile)
у меня тоже не работает, но следующее (как предложено в /questions/15654854/poluchenie-puti-r-skripta/15654858#15654858) у меня работает в Ubuntu 14.04
dirname(rstudioapi::getActiveDocumentContext()$path)