আরস্তুডিওতে উত্স ফাইলের স্থানে ওয়ার্কিং ডিরেক্টরি সেট করার জন্য আর কমান্ড


135

আমি আর এর কয়েকটি টিউটোরিয়াল তৈরি করছি Each প্রতিটি আর কোড একটি নির্দিষ্ট ফোল্ডারে থাকে। সেখানে ডেটা ফাইল এবং অন্যান্য ফাইল রয়েছে। আমি .rফাইলটি খুলতে চাই এবং এটি উত্সটি দিতে চাই যে নীচে দেখানো মত আমাকে আরস্তুডিওতে ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে হবে না:

এখানে চিত্র বর্ণনা লিখুন

আর এর মধ্যে আমার ওয়ার্কিং ডিরেক্টরিটি স্বয়ংক্রিয়ভাবে নির্দিষ্ট করার কোনও উপায় আছে?


এটি সম্ভবত একটি ডুপ। দেখুন?setwd ?getwd
ব্র্যান্ডন বার্টেলসেন


3
কোনও loadডুপ নয়, পোস্টারটি একই ফোল্ডারে .rdata-ফাইলগুলি চায় , sourceসোর্স করা ফাইলের পথে নির্ধারিত ওয়ার্কিং ডিরেক্টরি সহ নয় ।
রুবেন

উত্তর:


76

কোনও স্ক্রিপ্টের অবস্থান উত্সাহিত হওয়ার জন্য আপনি ব্যবহার করতে পারেন utils::getSrcDirectoryবা utils::getSrcFilename। সুতরাং চলমান ফাইলের মধ্যে কার্যকারী ডিরেক্টরিটি পরিবর্তন করে এটি করা যেতে পারে:

setwd(getSrcDirectory()[1])

আপনি যদি কোডটি উত্স-এর পরিবর্তে চালনা করেন তবে এটি আরস্টুডিওতে কাজ করে না । তার জন্য, আপনার ব্যবহার করা দরকার ।rstudioapi::getActiveDocumentContext

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

এই দ্বিতীয় সমাধানটির জন্য আপনি অবশ্যই অবশ্যই আইডিই হিসাবে আরস্টুডিও ব্যবহার করছেন।


এ আপনার নিজস্ব উত্তর stackoverflow.com/a/35842176/1247080 কাজ (এক dirname যদিও অন্তর্ভুক্ত করা আবশ্যক)। আমি এটি যুক্ত করেছি
স্টেট-আর

আমার জন্য কাজ করে না। আমি পেয়েছিError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru

2
মনে রাখবেন যে আপনি যখন getActiveDocumentContext()আরস্টুডিওর মধ্যে কনসোলে চলেছেন তখন পাথটি প্রতিবেদন করা হয়েছে ''। যাইহোক, আপনি সম্পাদক অংশে কোড লাইন চালনা করে, এটি প্রত্যাশিত হিসাবে কার্যকর করা হবে। এটি @ আন্ড্রু'র মন্তব্যে সম্বোধন করতে পারে
মেগাট্রন

1
@ গিয়াক_ম্যান মনে হচ্ছে আপনি rstudioapiপ্যাকেজের একটি খুব পুরানো সংস্করণ ব্যবহার করছেন । সর্বশেষতমটিতে আপডেট করার চেষ্টা করুন।
রিচি কটন

1
@mjs কনসোলের শীর্ষে, আপনার বর্তমান কার্যকারী ডিরেক্টরিটি দেখতে হবে। এর ডানদিকে একটি ছোট তীর। ফাইল ব্রাউজারে বর্তমানের কার্যনির্বাহী ডিরেক্টরিটি দেখতে এটিতে ক্লিক করুন।
রিচি কটন

62

আমি জানি এই প্রশ্নটি পুরানো, তবে আমি এর জন্য একটি সমাধানও অনুসন্ধান করেছিলাম এবং গুগল একে একে শীর্ষে তালিকাবদ্ধ করে:

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

যে কোনও জায়গায় এটি ফাইলের মধ্যে রাখুন (যদিও সর্বোত্তম শুরু হবে যদিও), যাতে ফাইলটি অনুযায়ী ডাব্লুডিকে পরিবর্তন করা যায়।

মন্তব্য অনুসারে, এটি প্রতিটি প্ল্যাটফর্মে অগত্যা কাজ করতে পারে না (উইন্ডোজ কাজ করে বলে মনে হচ্ছে, কারও জন্য লিনাক্স / ম্যাক)। মনে রাখবেন যে সমাধানটি ফাইলগুলিকে 'সোসারিং' করার জন্য, সেই ফাইলটিতে খণ্ডগুলি চালানোর জন্য অগত্যা নয়।

আরও দেখুন ফাইলের নাম এবং `source`d ফাইলের পাথ পেতে


99
আমার Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
পক্ষেও

4
লিনাক্সে @ ম্যাট ওব্রায়ান হিসাবে এখানে একই সমস্যা।
পাতাপুফ_ই

3
উত্সাহিত হলে নিখুঁতভাবে কাজ করা।
এম-ডিজে

2
উইন্ডোজ 10 তে আরস্টুডিও ভি 1.0.143 এ আমার জন্য কাজ করেছেন আপনি যদি "সংরক্ষণের উত্স" নির্বাচন করেন তবে এটি ঠিক কাজ করবে (আপনি "বিড়াল" দিয়ে সনাক্ত করা ডিরেক্টরিটি মুদ্রণ করতে পারেন)। আপনি যদি লাইনগুলি নির্বাচন করেন তবে সেগুলি কার্যকর করুন, তারপরে ফলাফলটি শূন্য।
কনটাঙ্গো

2
কোনও ফাইল সোর্স করার সময় এটি ম্যাকের জন্য আমার পক্ষে কাজ করে। যাইহোক, @ কনটাঙ্গো যেমন উপরে উল্লেখ করেছেন, কোডটি ইন্টারঅ্যাকটিভভাবে কার্যকর করার সময় কোনও অংশকে হাইলাইট করে এবং কমান্ড + রিটার্ন চাপ দিয়ে কাজ করবে না। এই ক্ষেত্রে, যেহেতু আপনি কোনও ফাইল সোর্সিং করছেন না, তাই ওয়ার্কিং ডিরেক্টরিটি থেকে টানতে কোনও উত্স ফাইল নেই। উত্তরের জন্য প্ল্যাটফর্ম-নির্দিষ্ট ক্যাভ্যাটগুলি নির্দিষ্ট করার দরকার নেই।
bmosov01

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

আমার জন্য কাজ করে তবে আপনি যদি আরস্টুডিওপি ব্যবহার করতে না চান এবং আপনি কোনও প্রাইসেক্টে না থাকেন তবে আপনি path চিহ্নটি আপনার পথে ব্যবহার করতে পারেন। প্রতীক ডিফল্ট আরস্টুডিও ওয়ার্কিং ডিরেক্টরি (কমপক্ষে উইন্ডোজে) নির্দেশ করে।

আর স্টুডিও বিকল্পগুলি

যদি আপনার আরস্টুডিও ওয়ার্কিং ডিরেক্টরিটি "ডি: / ডকুমেন্টস" setwd("~/proyect1")হয় তবে সেটডওইডের মতোই হয় ("ডি: / ডকুমেন্টস / প্রোকিট 1")।

একবার আপনি যে সেট করতে চান, আপনি একটি সাব নেভিগেট করতে পারেন: 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() )

আপনার ফাইলটি চালানো বা উত্সিত করার সময় এটি কাজ করে।

আপনাকে প্রথমে প্যাকেজটি আরস্টুডিওপি ইনস্টল করতে হবে। লক্ষ্য করুন যে আমি সঠিক জায়গায় আছি তা নিশ্চিত হওয়ার জন্য আমি 100% পথটি মুদ্রণ করেছি তবে এটি optionচ্ছিক।


সেটডউডে ত্রুটি (শিরোনাম (কারেন্ট_পথ)): কার্যকরী ডিরেক্টরি পরিবর্তন করতে পারে না
ট্যাভ্যালেন্ডো

@ হেলমো পরীক্ষা করে দেখুন যে আপনার ব্যবহারকারীর লক্ষ্য ডিরেক্টরিতে লেখার অনুমতি রয়েছে।
গাগারাইন

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এছাড়াও PowerShell কাজ করে, যেখানে এটি একটি ওরফে এর (যা বর্তমানে Windows ডিফল্ট শেল হিসেবে গণ্য করা হয়) 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 এ সংরক্ষণ করার জন্য সিস্টেম কমান্ড ব্যবহার করে, তারপরে আর. ফাইলটি ডেটা.ট্যাবল :: ফ্রেড ব্যবহার করে পড়ে। বাকিগুলি কেবল ফাইলটিতে কী মুদ্রিত হয়েছে তা পরিষ্কার করছে যাতে আমি কেবল ডিরেক্টরি পথ দিয়েই চলেছি।

আমার একটি ক্লাস্টারে আর চালানো দরকার, তাই আমি কোন ডিরেক্টরিটি শেষ করব তা জানার উপায় ছিল না (কাজগুলি একটি নম্বর এবং একটি গণনা নোড নিযুক্ত করে)। এটি আমার জন্য কৌশলটি করেছে।


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()ফাংশন, যা কিছু হিউরিস্টিক উপর ভিত্তি করে আপনার প্রকল্পের রুট ডিরেক্টরি ফেরৎ।

নিখুঁত সমাধান নয়, যেহেতু এটি স্ক্রিপ্টের অবস্থানটি সন্ধান করে না, তবে এটি কিছু উদ্দেশ্যে যথেষ্ট, তাই আমি ভেবেছিলাম যে আমি এটি এখানে রেখেছি।


1
এই উত্তরের জন্য ধন্যবাদ। উত্সটিতে একটি কল রেখে বর্তমান স্ক্রিপ্টের অবস্থানটি ব্যবহার করা যেতে পারে here::set_here()
ব্রোভিক

0

বেশিরভাগ জিইউআই অনুমান করে যে আপনি যদি কোনও ডিরেক্টরিতে থাকেন এবং "ওপেন" করেন তবে ডাবল-ক্লিক করুন বা অন্যথায় একটি .R ফাইল চালানোর চেষ্টা করবেন, অন্য যে কোনও ডিরেক্টরি উল্লেখ না করা হলে এটি যে ডিরেক্টরিতে থাকে সেগুলি ডিরেক্টরি ডিরেক্টরি হবে। ম্যাক জিইউআই সেই ডিফল্ট আচরণটি পরিবর্তন করার জন্য একটি পদ্ধতি সরবরাহ করে যা আপনি চলমান সেশনে সেট করা পছন্দসমূহের স্টার্টআপ প্যানেলে পরিবর্তনযোগ্য এবং পরবর্তী "প্রারম্ভকালে" কার্যকর হন। আপনার দিকেও নজর দেওয়া উচিত:

?Startup

আরস্টুডিও ডকুমেন্টেশন বলছে:

"ফাইল অ্যাসোসিয়েশনের মাধ্যমে যখন আরম্ভ করা হয় তখন আরস্টুডিও স্বয়ংক্রিয়ভাবে কার্যত ডিরেক্টরিটি খোলা ফাইলের ডিরেক্টরিতে সেট করে।" ডি। ডিফল্ট সেটআপটি আরআর স্টুডিওর জন্য .R ফাইলগুলির হ্যান্ডলার হিসাবে নিবন্ধিত হওয়ার জন্য, যদিও .Rdata এবং .R এক্সটেনশনের জন্য আরস্টুডিওর সাথে একটি ডিফল্ট "সমিতি" সেট করার ক্ষমতা সম্পর্কেও উল্লেখ রয়েছে। 'হ্যান্ডলারের' স্ট্যাটাস এবং 'অ্যাসোসিয়েশন' স্ট্যাটাস লিনাক্সে একই কিনা, আমি তা বলতে পারি না।

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


4
নিশ্চিতভাবে আরস্টুডিও সেই অনুমানটি করে না।
নিকো

1
এটি আমার মেশিনে বর্ণনা করার মতো আচরণ করে। আরস্টুডিও প্রিফারেন্সে আমি বিশেষ কিছু করিনি।
আইআরটিএফএম

2
লিনাক্সে এটি করবেন না :)
নিকো

2
"ফাইল সংস্থার মাধ্যমে যখন চালু করা হয়" এখানে মূল শর্ত। কিছু লোক টার্মিনালের একটি শর্টকাট বা একটি কমান্ডের মাধ্যমে রাস্তুদিও চালু করতে পারে। আপনার ফাইলটি খুলতে হবে এবং খোলার জন্য ডিফল্ট থাকতে হবে .আর ফাইলগুলি Rstudio হওয়া উচিত। আপনি যদি প্রথমে Rstudio খুলেন (তবে ফাইলটি খুলুন) এটি বর্ণিত হিসাবে কাজ করবে না। একটি ফাইল অ্যাসোসিয়েশনের মাধ্যমে, উপরের উত্তরটি উইন্ডোজ এবং ম্যাকে কাজ করে (সম্ভবত লিনাক্সটি @nico নির্দেশ করে না - তবে আমার লিনাক্স মেশিন না থাকায় আমি এটি যাচাই করতে পারি না)।
ওয়েটল্যাব স্টুডেন্ট

0
dirname(parent.frame(2)$ofile)  

আমার পক্ষেও কাজ করে না, তবে নিম্নলিখিতগুলি ( https://stackoverflow.com/a/35842176/992088 তে প্রস্তাবিত হিসাবে ) আমার জন্য উবুন্টু 14.04 এ কাজ করে

dirname(rstudioapi::getActiveDocumentContext()$path)

1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'এছাড়াও উবুন্টু 14.04
সমৃদ্ধ স্ক্রিভেন

সম্ভবত আপনি প্রথমে rstudioapi প্যাকেজ ইনস্টল করার চেষ্টা করতে পারেন।
ল্যামোথি

এটা অদ্ভুত. আমি একটি 32-বিট উবুন্টু 14.04 এ আর -২.২.৪ ব্যবহার করছি। আমি আশা করি এটি অপারেটিং সিস্টেম বা আর এর বিভিন্ন সংস্করণের কারণে নয়
লামোথি

0

আপনি যদি ইউটিএফ -8 এনকোডিং ব্যবহার করেন:

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

আপনি যদি প্যাকেজটি এখনও না করে থাকেন তবে আপনাকে ইনস্টল করতে হবে rstudioapi।


সেটডউড (তীর নাম (পাথ)) এ ত্রুটি: কাজের ডিরেক্টরিটি পরিবর্তন করতে পারে না
ট্যাভ্যালেন্ডো

W `set setwd (dirname (path)) এ ত্রুটি: কাজ ডিরেক্টরিটি পরিবর্তন করতে পারে না - আপনার সমাধান কাজ করছে না দয়া করে আপনার উত্তরটি দেখুন
মিঃ এস কোডার

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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.