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(), которая возвращает корневой каталог вашего проекта на основе некоторой эвристики.

Не идеальное решение, так как он не находит местоположение скрипта, но его достаточно для некоторых целей, поэтому я решил поместить его здесь.