R команда для встановлення робочого каталогу на розташування вихідного файлу в Rstudio


135

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

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

Чи є спосіб вказати мій робочий каталог автоматично в Р.


Це, мабуть, дупа. дивіться?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 працює (хоч має бути вказано ім’я dirname). Я додав його
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


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

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

працює для мене, але якщо ви не хочете користуватися rstudioapi і не перебуваєте в проекті, ви можете використовувати символ ~ на своєму шляху. Символ ~ посилається на робочу директорію RStudio за замовчуванням (принаймні в Windows).

Параметри RStudio

Якщо ваш робочий каталог RStudio "D: / Документи", setwd("~/proyect1")такий же, як і setwd ("D: / Документи / 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 (з батьківською рамкою замість sys.frame) не працювала для мене, я завжди отримую помилку.


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% впевненим, що я в потрібному місці, але це необов'язково.


Помилка setwd (dirname (current_path)): не вдається змінити робочий каталог
tavalendo

@helmo перевірити, чи має ваш користувач дозвіл на запис у цільовому каталозі.
гагарин

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])

1
Проблема цього рішення полягає в тому, що це дуже повільно. Пошук усіх файлів і зберігання в змінній також займає багато пам’яті.
tavalendo

4

Якщо ви працюєте в Linux, ви можете спробувати це:

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

Це працює для мене.


1
Це просто дає ваш домашній каталог (звідки починається ваша оболонка).
Caner

Це дає шлях до каталогу, де знаходиться запуск сценарію.
Таз

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". Сподіваюсь, це допоможе будь-кому іншому, хто, можливо, застряг.


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


4
Напевно RStudio не робить цього припущення.
nico

1
Він поводиться так, як я описав це на своїй машині. Я нічого не робив із налаштуваннями RStudio.
IRTFM

2
Не роби це на Linux :)
nico

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)

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.
Lamothy

0

Якщо ви використовуєте кодування UTF-8:

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

Вам потрібно встановити пакет rstudioapi, якщо ви ще цього не зробили.


Помилка setwd (dirname (path)): не вдається змінити робочий каталог
tavalendo

`` Помилка в 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.