คำสั่ง R สำหรับตั้งค่าไดเร็กทอรีการทำงานไปยังตำแหน่งไฟล์ต้นทางใน Rstudio


141

ฉันกำลังหาบทเรียนบางอย่างใน R รหัส R แต่ละตัวจะอยู่ในโฟลเดอร์เฉพาะ มีไฟล์ข้อมูลและไฟล์อื่น ๆ อยู่ในนั้น ฉันต้องการเปิด.rไฟล์และซอร์สไฟล์โดยที่ฉันไม่ต้องเปลี่ยนไดเร็กทอรีการทำงานใน Rstudio ดังที่แสดงด้านล่าง:

ป้อนคำอธิบายภาพที่นี่

มีวิธีระบุไดเร็กทอรีการทำงานของฉันโดยอัตโนมัติใน R หรือไม่


นี่อาจเป็นการหลอกลวง ดู?setwd ?getwd
Brandon Bertelsen


3
ไม่ใช่การหลอกลวงผู้โพสต์ต้องการที่จะ. loadrdata-files ในโฟลเดอร์เดียวกันไม่ใช่sourceกับไดเร็กทอรีการทำงานที่ตั้งค่าเป็นพา ธ ของไฟล์ที่มา
Ruben

คำตอบ:


83

จะได้รับตำแหน่งของสคริปต์ถูกมาคุณสามารถใช้หรือ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'
Andru

2
โปรดทราบว่าเมื่อคุณรันgetActiveDocumentContext()ในคอนโซลภายใน RStudio เส้นทางจะถูกรายงานเป็น''ไฟล์. อย่างไรก็ตามหากคุณเรียกใช้บรรทัดของโค้ดในส่วนตัวแก้ไขโค้ดจะดำเนินการตามที่คาดไว้ สิ่งนี้อาจกล่าวถึงความคิดเห็นของ @Andru
Megatron

1
@giac_man ดูเหมือนว่าคุณกำลังใช้rstudioapiแพ็คเกจเวอร์ชันเก่ามาก ลองอัปเดตเป็นเวอร์ชันล่าสุด
Richie Cotton

1
@mjs ที่ด้านบนสุดของคอนโซลคุณจะเห็นไดเร็กทอรีการทำงานปัจจุบัน ทางขวาของลูกศรเล็ก ๆ คลิกเพื่อแสดงไดเร็กทอรีการทำงานปัจจุบันในเบราว์เซอร์ไฟล์
Richie Cotton

64

ฉันรู้ว่าคำถามนี้ล้าสมัย แต่ฉันกำลังค้นหาวิธีแก้ปัญหานี้เช่นกันและ Google แสดงรายการนี้ไว้ที่ด้านบนสุด:

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

ใส่ลงในไฟล์ (ที่ดีที่สุดคือจุดเริ่มต้น) เพื่อให้ wd เปลี่ยนไปตามไฟล์นั้น

ตามความคิดเห็นสิ่งนี้อาจไม่จำเป็นต้องใช้ได้กับทุกแพลตฟอร์ม (Windows ดูเหมือนจะใช้งานได้, Linux / Mac สำหรับบางรุ่น) โปรดทราบว่าโซลูชันนี้มีไว้สำหรับการ "จัดหา" ไฟล์ซึ่งไม่จำเป็นต้องใช้สำหรับการเรียกใช้ไฟล์นั้น

โปรดดูชื่อไฟล์และเส้นทางของไฟล์ "source`d ด้วย


101
ไม่ได้ผลสำหรับฉัน:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster

4
ปัญหาเดียวกันกับ @Matt O'Brien บน Linux
patapouf_ai

4
ทำงานได้อย่างสมบูรณ์หากมีแหล่งที่มา
m-dz

2
ทำงานให้ฉันใน RStudio v1.0.143 บน Windows 10 หากคุณเลือก "Source on save" มันจะทำงานได้ดี (คุณสามารถพิมพ์ไดเร็กทอรีที่ตรวจพบด้วย "cat") หากคุณเลือกบรรทัดแล้วดำเนินการตามนั้นผลลัพธ์จะเป็นโมฆะ
Contango

2
สิ่งนี้ใช้ได้กับฉันบน Mac เมื่อจัดหาไฟล์ อย่างไรก็ตามตามที่ @Contango ระบุไว้ข้างต้นมันจะไม่ทำงานเมื่อเรียกใช้โค้ดแบบโต้ตอบโดยการไฮไลต์ส่วนและกด Command + Return ในกรณีนี้เนื่องจากคุณไม่ได้จัดหาไฟล์จึงไม่มีซอร์สไฟล์ที่จะดึงไดเร็กทอรีการทำงานมา คำตอบไม่จำเป็นต้องระบุคำเตือนเฉพาะแพลตฟอร์ม
bmosov01

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

นี่เป็นวิธีที่ดีที่สุดสำหรับฉันในการเขียนโค้ดสคริปต์ไม่ว่าคุณจะใช้คอมพิวเตอร์เครื่องใดก็ตาม


7

สำหรับrstudioคุณสามารถตั้งค่าไดเร็กทอรีการทำงานของคุณเป็นไดเร็กทอรีสคริปต์โดยอัตโนมัติโดยใช้rstudioapiดังนี้:

library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )

ใช้งานได้เมื่อเรียกใช้หรือ Source ไฟล์ของคุณ

คุณต้องติดตั้งแพคเกจ rstudioapi ก่อน แจ้งให้ทราบว่าฉันพิมพ์เส้นทางเพื่อให้แน่ใจ 100% ว่าฉันมาถูกที่แล้ว แต่นี่เป็นทางเลือก


ข้อผิดพลาดใน setwd (dirname (current_path)): ไม่สามารถเปลี่ยนไดเร็กทอรีการทำงานได้
tavalendo

@helmo ตรวจสอบว่าผู้ใช้ของคุณมีสิทธิ์ในการเขียนบนไดเร็กทอรีเป้าหมาย
กาการีน

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) ไม่ได้ผลสำหรับฉันฉันมักจะได้รับข้อผิดพลาด


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

ให้พา ธ ไปยังไดเร็กทอรีที่สคริปต์ที่คุณรันอยู่
Taz

2
pwd ย่อมาจาก present working directory สิ่งนี้จะตั้งค่าไดเร็กทอรีเป็นไดเร็กทอรีปัจจุบันของเชลล์คืออะไร
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

Mine ขึ้นอยู่กับคำสั่งระบบง่ายๆ สิ่งที่คุณป้อนฟังก์ชันคือชื่อของสคริปต์ของคุณ:

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

GUI ส่วนใหญ่คิดว่าถ้าคุณอยู่ในไดเร็กทอรีและ "เปิด" ให้ดับเบิลคลิกหรือพยายามเรียกใช้ไฟล์. R ซึ่งไดเร็กทอรีที่อยู่จะเป็นไดเร็กทอรีการทำงานเว้นแต่จะระบุไว้เป็นอย่างอื่น Mac GUI มีวิธีการเปลี่ยนลักษณะการทำงานเริ่มต้นซึ่งเปลี่ยนแปลงได้ในแผงการเริ่มต้นของการตั้งค่าที่คุณตั้งไว้ในเซสชันที่กำลังทำงานอยู่และจะมีผลใน "การเริ่มต้น" ครั้งถัดไป คุณควรดูที่:

?Startup

เอกสาร RStudio กล่าวว่า:

"เมื่อเรียกใช้ผ่านการเชื่อมโยงไฟล์ RStudio จะตั้งค่าไดเร็กทอรีการทำงานเป็นไดเร็กทอรีของไฟล์ที่เปิดโดยอัตโนมัติ" การตั้งค่าเริ่มต้นมีไว้สำหรับ RStudio ที่จะลงทะเบียนเป็นตัวจัดการสำหรับไฟล์. R แม้ว่าจะมีการระบุถึงความสามารถในการตั้งค่า "การเชื่อมโยง" เริ่มต้นกับ RStudio สำหรับส่วนขยาย. RData และ. R ไม่ว่าจะมีสถานะ 'ตัวจัดการ' และสถานะ 'การเชื่อมโยง' เหมือนกันบน Linux ฉันไม่สามารถบอกได้

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


4
แน่นอนว่า RStudio ไม่ได้ตั้งสมมติฐานนั้น
nico

1
มันทำงานตามที่ฉันอธิบายไว้ในเครื่องของฉัน ฉันไม่ได้ทำอะไรเป็นพิเศษกับ RStudio Preferences
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 ก่อน
Lamothy

นั่นเป็นเรื่องแปลก ฉันใช้ R-3.2.4 ใน ubuntu 14.04 แบบ 32 บิต ฉันหวังว่าจะไม่ใช่เพราะระบบปฏิบัติการหรือเวอร์ชันอื่นของ R.
Lamothy

0

ในกรณีที่คุณใช้การเข้ารหัส UTF-8:

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

คุณต้องติดตั้งแพคเกจ rstudioapi หากคุณยังไม่ได้ทำ


ข้อผิดพลาดใน setwd (dirname (path)): ไม่สามารถเปลี่ยนไดเร็กทอรีการทำงาน
tavalendo

`` Error in setwd (dirname (path)): can't change working directory`` โซลูชันของคุณไม่ทำงานโปรดตรวจสอบคำตอบของคุณ
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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.