Команда R для установки рабочего каталога в расположение исходного файла в Rstudio

135

Я работаю над некоторыми учебниками по R. Каждый код R содержится в определенной папке. Там есть файлы данных и другие файлы. Я хочу открыть .rфайл и получить его так, чтобы мне не приходилось менять рабочий каталог в Rstudio, как показано ниже:

введите описание изображения здесь

Есть ли способ автоматически указать мой рабочий каталог в R.

Стат-R,
источник
Наверное, это обман. см.?setwd ?getwd
Брэндон Бертельсен
3
Не обман, плакат хочет, чтобы load.rdata-файлы в одной папке, а не sourceс рабочим каталогом, установленным на путь к исходному файлу.
Рубен

Ответы:

76

Чтобы получить местоположение исходного сценария, вы можете использовать utils::getSrcDirectoryили utils::getSrcFilename. Таким образом, изменить рабочий каталог на каталог текущего файла можно с помощью:

setwd(getSrcDirectory()[1])

Это не работает в RStudio, если вы запустите код, а не его исходный код . Для этого вам нужно использовать rstudioapi::getActiveDocumentContext.

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

Это второе решение требует, конечно, использования RStudio в качестве IDE.

Ричи Коттон
источник
ваш собственный ответ на stackoverflow.com/a/35842176/1247080 работает (хотя необходимо указать имя каталога). Я добавил это
Stat-R
Не работает для меня Я получаюError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Андру
2
Обратите внимание, что при запуске getActiveDocumentContext()в консоли в RStudio путь указывается как ''. Однако, если вы запустите строку кода в редакторе, она будет выполняться должным образом. Это может быть связано с комментарием @Andru
Megatron
1
@giac_man Похоже, вы используете очень старую версию rstudioapiпакета. Попробуйте обновиться до последней версии.
Ричи Коттон
1
@mjs В верхней части консоли вы должны увидеть текущий рабочий каталог. Справа от него маленькая стрелка. Щелкните его, чтобы отобразить текущий рабочий каталог в файловом браузере.
Ричи Коттон,
62

Я знаю, что этот вопрос устарел, но я тоже искал решение для этого, и Google перечисляет его в самом верху:

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

поместите это где-нибудь в файл (хотя лучше всего было бы начало), чтобы wd изменялся в соответствии с этим файлом.

Согласно комментариям, это может не обязательно работать на каждой платформе (Windows, похоже, работает, Linux / Mac для некоторых). Имейте в виду, что это решение предназначено для «поиска» файлов, а не обязательно для запуска фрагментов в этом файле.

см. также получить имя файла и путь к файлу `source`d

BumbleBee
источник
99
у меня тоже не сработало:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster
4
Здесь та же проблема, что и у @Matt O'Brien в Linux.
patapouf_ai
3
Работает отлично, если получено.
m-dz
2
Работал у меня в RStudio v1.0.143 в Windows 10. Если вы выберете «Источник при сохранении», он будет работать нормально (вы можете распечатать обнаруженный каталог с помощью «cat»). Если вы выберете строки, а затем выполните их, результат будет нулевым.
контанго
2
У меня это работает на Mac при поиске файла. Однако, как указано выше в @Contango, он не будет работать при выполнении кода в интерактивном режиме, выделив фрагмент и нажав Command + Return. В этом случае, поскольку вы не получаете файл из источника, нет исходного файла, из которого можно было бы извлечь рабочий каталог. В ответе не нужно указывать оговорки, связанные с конкретной платформой.
bmosov01 05
7
dirname(rstudioapi::getActiveDocumentContext()$path)

работает для меня, но если вы не хотите использовать rstudioapi и не участвуете в проекте, вы можете использовать символ ~ в своем пути. Символ ~ относится к рабочему каталогу 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")

Для меня это лучший способ писать сценарии, независимо от того, какой компьютер вы используете.

Хуан Пуэйо
источник
6

Этот ответ может помочь:

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) мне не помог, я всегда получаю сообщение об ошибке.

sietemonos
источник
6

Для 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% уверенным, что нахожусь в нужном месте, но это необязательно.

gagarine
источник
Ошибка в setwd (dirname (current_path)): невозможно изменить рабочий каталог
tavalendo 01
@helmo проверьте, что у вашего пользователя есть разрешение на запись в целевой каталог.
gagarine 03
5

Решение

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])
namu.net
источник
1
Проблема с этим решением в том, что оно работает очень медленно. Поиск всех файлов и сохранение в переменной также занимает много памяти.
tavalendo 01
4

Если вы работаете в Linux, вы можете попробовать следующее:

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

Меня устраивает.

Таз
источник
1
Это просто дает ваш домашний каталог (где запускается ваша оболочка).
Caner
Он указывает путь к каталогу, в котором находится запускаемый вами скрипт.
Taz
2
pwd означает текущий рабочий каталог. Это установит каталог в любой текущий каталог оболочки.
PeterVermont
pwdтакже работает в PowerShell (который в настоящее время считается оболочкой по умолчанию в Windows), где он является псевдонимом для Get-Location.
BroVic
3

Я просто искал решение этой проблемы, зашел на эту страницу. Я знаю, что он устарел, но предыдущие решения меня не устраивали или не работали. Вот моя работа, если интересно.

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)
Райан Либерт
источник
Есть ли причина, по которой вы просто не используете setwd( dirname(filepath) )?
jodis
3

Я понимаю, что это старый поток, но у меня была аналогичная проблема с необходимостью установить рабочий каталог, и я не мог заставить какое-либо из решений работать на меня. Вот что сработало, на случай, если кто-то еще наткнется на это позже:

# 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 в кластере, поэтому не было возможности узнать, в каком каталоге я окажусь (заданиям присваивается номер и вычислительный узел). Это помогло мне.

Кэти Ренвик
источник
2

Я понимаю, что это устарело, но я не мог заставить предыдущие ответы работать очень удовлетворительно, поэтому я хотел внести свой метод на случай, если кто-то еще столкнется с той же ошибкой, что и в комментариях к ответу 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". Надеюсь, это поможет любому, кто застрял.

Tgsmith61591
источник
1

hereПакет обеспечиваетhere() функцию, которая возвращает свой проект корневого каталога на основе некоторых эвристик.

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

Будет
источник
1
Спасибо за этот ответ. Местоположение текущего скрипта можно определить, позвонив here::set_here()в источник.
BroVic
0

Большинство графических интерфейсов пользователя предполагают, что если вы находитесь в каталоге и «открываете», дважды щелкаете мышью или иным образом пытаетесь выполнить файл .R, то каталог, в котором он находится, будет рабочим каталогом, если не указано иное. Графический пользовательский интерфейс Mac предоставляет метод для изменения этого поведения по умолчанию, которое можно изменить на панели «Запуск» настроек, которые вы устанавливаете в текущем сеансе, и которое вступит в силу при следующем «запуске». Вы также должны смотреть на:

?Startup

В документации RStudio говорится:

«При запуске через файловую ассоциацию RStudio автоматически устанавливает рабочий каталог на каталог открытого файла». По умолчанию RStudio регистрируется как обработчик для файлов .R, хотя есть также упоминание о возможности установить "ассоциацию" по умолчанию с RStudio для расширений .Rdata и .R. Я не могу сказать, являются ли статусы «обработчик» и «ассоциация» одинаковыми в Linux.

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

IRTFM
источник
4
Конечно, RStudio не делает этого предположения.
Нико
1
Он ведет себя так, как я описал на своей машине. Я не делал ничего особенного в настройках RStudio.
IRTFM 02
2
Не работает в Linux :)
Нико
2
«При запуске через файловую ассоциацию» здесь является ключевым условием. Некоторые люди могут запускать Rstudio с помощью ярлыка или команды в терминале. Вам нужно открыть файл и установить по умолчанию для открытия файлов .R Rstudio. Если вы сначала откроете Rstudio (а затем откроете файл), он не будет работать, как описано. Через ассоциацию файлов приведенный выше ответ работает в Windows и Mac (возможно, не в Linux, как указывает @nico, но я не могу это проверить, так как у меня нет Linux-машины).
WetlabStudent
0
dirname(parent.frame(2)$ofile)  

у меня тоже не работает, но следующее (как предлагается в https://stackoverflow.com/a/35842176/992088 ) работает для меня в ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)
Lamothy
источник
1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'также в Ubuntu 14.04
Rich Scriven
Возможно, вы можете сначала попробовать установить пакет rstudioapi.
Ламоти,
Это странно. Я использую R-3.2.4 в 32-битной Ubuntu 14.04. Я надеюсь, что это не из-за операционной системы или разных версий R.
Ламоти
0

Если вы используете кодировку UTF-8:

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

Вам необходимо установить пакет rstudioapi, если вы еще этого не сделали.

jormaga
источник
Ошибка в setwd (dirname (path)): невозможно изменить рабочий каталог
tavalendo 01
`` Ошибка в setwd (dirname (path)): невозможно изменить рабочий каталог '' ваше решение не работает, проверьте свой ответ
г-н S Coder,
0

Вот еще один способ сделать это:

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()
Issam
источник