Rstudio में स्रोत फ़ाइल स्थान पर कार्यशील निर्देशिका स्थापित करने के लिए कमांड


135

मैं आर में कुछ ट्यूटोरियल काम कर रहा हूं। प्रत्येक आर कोड एक विशिष्ट फ़ोल्डर में निहित है। वहाँ डेटा फ़ाइलें और अन्य फ़ाइलें हैं। मैं .rफ़ाइल को खोलना चाहता हूं और इसे इस तरह से स्रोत करता हूं कि मुझे Rstudio में काम करने वाली निर्देशिका को बदलना नहीं है जैसा कि नीचे दिखाया गया है:

यहाँ छवि विवरण दर्ज करें

क्या मेरी कार्य निर्देशिका को स्वचालित रूप से आर में निर्दिष्ट करने का एक तरीका है।


यह शायद एक धोखा है। देखें?setwd ?getwd
ब्रैंडन बर्टेलसन


3
loadडुप्लीकेट नहीं, पोस्टर उसी फ़ोल्डर में .rdata-files को चाहता है , न कि खट्टी फाइल 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 शामिल होना चाहिए)। मैंने इसे जोड़ा
स्टेट-आर

मेरे लिए काम नहीं करता है। मुझे मिलता है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 को उस फ़ाइल के अनुसार बदल दिया जाए।

टिप्पणियों के अनुसार, यह जरूरी नहीं कि हर प्लेटफॉर्म पर काम करे (विंडोज काम करने लगता है, लिनक्स / मैक कुछ के लिए)। ध्यान रखें कि यह समाधान फाइलों को 'सोर्सिंग' के लिए है, जरूरी नहीं कि उस फाइल में चंक्स चलाने के लिए हो।

यह भी देखें कि फ़ाइल का नाम और रास्ता `source`d फ़ाइल का है


99
मेरे लिए या तो काम नहीं किया:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster

4
लिनक्स पर @Matt O'Brien के रूप में एक ही समस्या है।
patapouf_ai

3
पूरी तरह से काम अगर खट्टा है।
m-dz

2
विंडोज 10 पर RStudio v1.0.143 में मेरे लिए काम किया। यदि आप "सेव ऑन सोर्स" चुनते हैं, तो यह ठीक काम करेगा (आप "बिल्ली" के साथ पता लगाया गया निर्देशिका प्रिंट कर सकते हैं)। यदि आप लाइनों का चयन करते हैं तो उन्हें निष्पादित करें, फिर परिणाम शून्य है।
कंटैंगो

2
यह मेरे लिए एक मैक पर काम करता है जब एक फ़ाइल सोर्सिंग। हालाँकि, जैसा कि @ कांटांगो ने ऊपर बताया है, यह तब काम नहीं करेगा जब कोड को अंतःक्रियात्मक रूप से एक चंक को हाइलाइट करके और कमांड रिटर्न को दबाया जाए। इस मामले में, चूंकि आप फ़ाइल की सोर्सिंग नहीं कर रहे हैं, इसलिए वर्किंग डायरेक्टरी को खींचने के लिए कोई सोर्स फाइल नहीं है। उत्तर को प्लेटफ़ॉर्म-विशिष्ट कैविट निर्दिष्ट करने की आवश्यकता नहीं है।
bmosov01

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

मेरे लिए काम करता है, लेकिन अगर आप rstudioapi का उपयोग नहीं करना चाहते हैं और आप एक प्रॉजेक्ट में नहीं हैं, तो आप अपने पथ में प्रतीक ~ का उपयोग कर सकते हैं। प्रतीक ~ डिफ़ॉल्ट RStudio कार्य निर्देशिका (कम से कम विंडोज पर) को संदर्भित करता है।

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-

बम्बलबी का उत्तर (माता-पिता के साथ 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
इस समाधान के साथ समस्या यह है कि बहुत धीमी है। एक चर में सभी फ़ाइलों और स्टोर की खोज में भी बहुत सारी मेमोरी होती है।
तवलेंदो

4

यदि आप लिनक्स पर काम करते हैं तो आप यह कोशिश कर सकते हैं:

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

इससे मेरा काम बनता है।


1
यह आपके घर की निर्देशिका (जहां आपका शेल शुरू होता है) देता है।
कनेर

यह निर्देशिका का पथ देता है जहाँ आप स्क्रिप्ट चलाते हैं।
ताज़

2
वर्तमान कार्य निर्देशिका के लिए pwd का अर्थ है यह उस निर्देशिका को सेट करेगा जो शेल की वर्तमान निर्देशिका है।
पीटरवर्मोंट

pwdयह PowerShell (जो वर्तमान में विंडोज पर डिफ़ॉल्ट शेल माना जाता है) में भी काम करता है, जहां यह एक उपनाम है Get-Location
ब्राविक

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 का उपयोग करके पढ़ता है। बाकी बस सफाई कर रहा है जो फ़ाइल में मुद्रित हो गया है ताकि मैं सिर्फ निर्देशिका पथ के साथ छोड़ दूं।

मुझे एक क्लस्टर पर आर चलाने की आवश्यकता थी, इसलिए यह जानने का कोई तरीका नहीं था कि मैं किस निर्देशिका में काम करूंगा (नौकरियों को एक नंबर और एक गणना नोड सौंपा गया है)। इसने मेरे लिए चाल चली।


2

मैं समझता हूं कि यह पुराना है, लेकिन मैं पूर्व के जवाबों को बहुत संतोषजनक ढंग से काम करने के लिए नहीं प्राप्त कर सका, इसलिए मैं किसी और के भौंरे के जवाब में टिप्पणियों में उल्लिखित उसी त्रुटि का सामना करने की स्थिति में अपनी पद्धति का योगदान करना चाहता था।

मेरा एक साधारण सिस्टम कमांड पर आधारित है। आप जो भी कार्य करते हैं, वह आपकी लिपि का नाम है:

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() समारोह है, जो कुछ heuristics के आधार पर अपनी परियोजना रूट निर्देशिका देता है।

सही समाधान नहीं है, क्योंकि यह स्क्रिप्ट का स्थान नहीं खोजता है, लेकिन यह कुछ उद्देश्यों के लिए पर्याप्त है, इसलिए मैंने सोचा कि मैं इसे यहां डालूंगा।


1
इस उत्तर के लिए धन्यवाद। वर्तमान स्क्रिप्ट के स्थान को कॉल को here::set_here()स्रोत में रखकर दोहन किया जा सकता है ।
ब्रोविक

0

अधिकांश GUI यह मानते हैं कि यदि आप एक निर्देशिका और "ओपन" में हैं, तो डबल-क्लिक करें, या अन्यथा .R फ़ाइल को निष्पादित करने का प्रयास करें, जिसमें वह निर्देशिका जिसमें वह रहता है, जब तक अन्यथा निर्दिष्ट न हो। मैक GUI उस डिफ़ॉल्ट व्यवहार को बदलने के लिए एक विधि प्रदान करता है जो कि वरीयता के स्टार्टअप पैनल में परिवर्तनशील है जिसे आप एक चालू सत्र में सेट करते हैं और अगले "स्टार्टअप" पर प्रभावी हो जाते हैं। आपको भी देखना चाहिए:

?Startup

RStudio प्रलेखन कहता है:

"जब एक फ़ाइल एसोसिएशन के माध्यम से लॉन्च किया जाता है, तो RStudio स्वचालित रूप से खोली गई फ़ाइल की निर्देशिका में कार्यशील निर्देशिका को सेट करता है।" डिफ़ॉल्ट सेटअप RStudio के लिए .R फ़ाइलों के लिए एक हैंडलर के रूप में पंजीकृत होने के लिए है, हालाँकि .Rdata और .R एक्सटेंशन के लिए RStudio के साथ एक डिफ़ॉल्ट "एसोसिएशन" सेट करने की क्षमता का भी उल्लेख है। चाहे 'हैंडलर' की स्थिति और 'एसोसिएशन' की स्थिति लिनक्स पर समान हो, मैं नहीं बता सकता।

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


4
निश्चित रूप से RStudio यह धारणा नहीं बनाता है।
निको

1
यह मेरे मशीन पर वर्णित तरीके से व्यवहार करता है। मैंने RStudio प्राथमिकता के लिए कुछ खास नहीं किया है।
IRTFM 19

2
लिनक्स पर ऐसा नहीं है :)
nico

2
"जब एक फ़ाइल एसोसिएशन के माध्यम से लॉन्च किया जाता है" तो यहां महत्वपूर्ण स्थिति है। कुछ लोग Rstudio को शॉर्टकट या टर्मिनल में एक कमांड के माध्यम से लॉन्च कर सकते हैं। आपको फ़ाइल खोलने की आवश्यकता है और खोलने के लिए डिफ़ॉल्ट है .R फाइलें Rstudio हो। यदि आप पहले Rstudio खोलते हैं (तो फ़ाइल खोलें) यह वर्णित के रूप में काम नहीं करेगा। एक फ़ाइल एसोसिएशन के माध्यम से, उपरोक्त उत्तर विंडोज़ और मैक में काम करता है (संभवतः @nico के रूप में लिनक्स नहीं है - लेकिन मैं इसे सत्यापित नहीं कर सकता क्योंकि मेरे पास एक लिनक्स मशीन नहीं है)।
वेटलैबस्टूडेंट

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'उबंटू में भी 14.04
रिच स्क्रिपवेन

शायद आप पहले rstudioapi पैकेज स्थापित करने का प्रयास कर सकते हैं।
लामोथी

वह अजीब है। मैं 32-बिट ubuntu 14.04 में R-3.2.4 का उपयोग कर रहा हूं। मुझे आशा है कि यह ऑपरेटिंग सिस्टम या आर के विभिन्न संस्करणों के कारण नहीं है
लामोथी

0

यदि आप UTF-8 एन्कोडिंग का उपयोग करते हैं:

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

यदि आपने अभी तक ऐसा नहीं किया है तो आपको पैकेज rstudioapi को स्थापित करना होगा।


Setwd में त्रुटि (dirname (पथ)): कार्यशील निर्देशिका को परिवर्तित नहीं किया जा सकता है
tavalendo

`` `Setwd में त्रुटि (dirname (पथ)): कार्यशील निर्देशिका को परिवर्तित नहीं कर सकता` `आपका समाधान काम नहीं कर रहा है कृपया अपना उत्तर जांचें
Mr 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.