Rstudio에서 작업 디렉토리를 소스 파일 위치로 설정하기위한 R 명령


135

R에서 자습서를 만들고 있습니다. 각 R 코드는 특정 폴더에 포함되어 있습니다. 거기에 데이터 파일과 다른 파일이 있습니다. .r파일 을 열고 소스를 지정하여 아래와 같이 Rstudio에서 작업 디렉토리를 변경할 필요가 없습니다.

여기에 이미지 설명을 입력하십시오

R에서 작업 디렉토리를 자동으로 지정하는 방법이 있습니까?


이것은 아마 속임수입니다. 참조?setwd ?getwd
Brandon Bertelsen


3
속임수가 아니라 포스터는 작업 디렉토리가 소스 파일의 경로로 설정되어 load있지 않고 동일한 폴더에있는 .rdata-files 를 원합니다 source.
Ruben

답변:


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'
Andru

2
getActiveDocumentContext()RStudio 내의 콘솔에서 실행할 때 경로는로보고됩니다 ''. 그러나 편집기 부분에서 코드 줄을 실행하면 예상대로 실행됩니다. 이것은 @Andru의 의견을 해결할 수 있습니다
Megatron

1
@giac_man 아주 오래된 버전의 rstudioapi패키지를 사용하고있는 것 같습니다 . 최신 버전으로 업데이트하십시오.
Richie Cotton 2

1
@mjs 콘솔 상단에 현재 작업 디렉토리가 나타납니다. 그 오른쪽에는 작은 화살표가 있습니다. 파일 브라우저에 현재 작업 디렉토리를 표시하려면 클릭하십시오.
Richie Cotton

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
Linux의 @Matt O'Brien과 같은 문제가 있습니다.
patapouf_ai

3
공급 원인 경우 완벽하게 작동합니다.
m-dz

2
Windows 10의 RStudio v1.0.143에서 저를 위해 일했습니다. "저장시 소스"를 선택하면 제대로 작동합니다 (감지 된 디렉토리를 "cat"으로 인쇄 할 수 있음). 행을 선택한 다음 실행하면 결과는 null입니다.
Contango

2
이것은 파일을 소싱 할 때 Mac에서 작동합니다. 그러나 @Contango가 위에서 지적했듯이 청크를 강조 표시하고 Command + Return을 눌러 대화식으로 코드를 실행할 때는 작동하지 않습니다. 이 경우 파일을 소싱하지 않기 때문에 작업 디렉토리를 가져올 소스 파일이 없습니다. 대답은 플랫폼 별 경고를 지정할 필요가 없습니다.
bmosov01 2016 년

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

이것은 어떤 컴퓨터를 사용하든 스크립트를 코딩하는 가장 좋은 방법입니다.



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 사용자에게 대상 디렉토리에 대한 쓰기 권한이 있는지 확인하십시오.
gagarine

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는 현재 작업 디렉토리를 나타냅니다. 이것은 쉘의 현재 디렉토리가 무엇이든 디렉토리를 설정합니다.
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

대부분의 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 환경 설정에 특별한 작업을 수행하지 않았습니다.
IRTFM

2
리눅스에서 그렇게하지 않습니다 :)
nico

2
여기서는 "파일 연결을 통해 시작할 때"가 핵심 조건입니다. 일부 사람들은 터미널의 바로 가기 또는 명령을 통해 Rstudio를 시작했을 수 있습니다. 파일을 열고 .R 파일을 여는 데 필요한 기본값은 Rstudio입니다. Rstudio를 먼저 열면 (파일을 열면) 설명 된대로 작동하지 않습니다. 파일 연결을 통해 위의 대답은 Windows 및 Mac에서 작동합니다 (@nico가 지적한 것처럼 Linux는 아니지만 Linux 시스템이 없기 때문에 확인할 수는 없습니다).
WetlabStudent

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에서
Rich Scriven

rstudioapi 패키지를 먼저 설치해보십시오.
Lamothy

이상하다. 32 비트 우분투 14.04에서 R-3.2.4를 사용하고 있습니다. 운영 체제 또는 다른 버전의 R 때문이
아니길 바랍니다

0

UTF-8 인코딩을 사용하는 경우 :

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

rstudioapi 패키지를 아직 설치하지 않았다면 설치해야합니다.


setwd (dirname (path)) 오류 : 작업 디렉토리를 변경할 수 없습니다
tavalendo

```setwd (dirname (path)) 오류 : 작업 디렉토리를 변경할 수 없습니다 ''솔루션이 작동하지 않습니다 답변을 확인하십시오
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.