Rstudioで作業ディレクトリをソースファイルの場所に設定するRコマンド


135

Rでいくつかのチュートリアルを作成しています。各Rコードは特定のフォルダーに含まれています。そこにデータファイルと他のファイルがあります。.r以下に示すように、Rstudioの作業ディレクトリを変更する必要がないように、ファイルを開いてソースを設定します。

ここに画像の説明を入力してください

Rで自分の作業ディレクトリを自動的に指定する方法はありますか?


これはおそらくだまされたものです。参照?setwd ?getwd
Brandon Bertelsen


3
loadだまされたものではなく、投稿者は同じフォルダ内の.rdata-filesを望んでsourceおり、作業ディレクトリはソースファイルのパスに設定されていません。
ルーベン

回答:


76

ソースとなるスクリプトの場所を取得するには、utils::getSrcDirectoryまたはを使用できますutils::getSrcFilename。したがって、作業ディレクトリを現在のファイルのディレクトリに変更するには、次のようにします。

setwd(getSrcDirectory()[1])

ソースからではなくコードを実行する場合、RStudioではこれは機能しません。そのためには、を使用する必要があります。rstudioapi::getActiveDocumentContext

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

この2番目のソリューションでは、もちろん、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パッケージを使用しているようです。最新のものに更新してみてください。
リッチーコットン

1
@mjsコンソールの上部に、現在の作業ディレクトリが表示されます。その右側には小さな矢印があります。これをクリックすると、ファイルブラウザに現在の作業ディレクトリが表示されます。
リッチーコットン

62

私はこの質問が古いことを知っていますが、私もその解決策を探していました。Googleはこれを一番上にリストしています:

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

それをファイルのどこかに入れます(ただし、先頭が最適です)。そのファイルに従ってwdが変更されます。

コメントによると、これは必ずしもすべてのプラットフォームで機能するとは限りません(Windowsは機能しているようですが、一部はLinux / Macです)。このソリューションはファイルを「調達」するためのものであり、必ずしもそのファイルでチャンクを実行するためのものではないことに注意してください。

「ソース」ファイルのファイル名とパスの取得も参照してください


99
私にもError in dirname(parent.frame(2)$ofile) : a character vector argument expected
うまくいき

4
Linuxの@Matt O'Brienと同じ問題。
patapouf_ai 2015年

3
調達すれば完璧に機能します。
m-dz

2
Windows 10のRStudio v1.0.143で動作しました。[保存時にソース]を選択すると、問題なく動作します(検出されたディレクトリを "cat"で印刷できます)。行を選択して実行すると、結果はnullになります。
Contango 2017年

2
これはMacでファイルを調達するときに機能します。ただし、@ Contangoが上記で指摘したように、チャンクを強調表示してCommand + Returnを押してインタラクティブにコードを実行する場合は機能しません。この場合、ファイルを調達していないため、作業ディレクトリをプルするソースファイルはありません。答えは、プラットフォーム固有の警告を指定する必要はありません。
bmosov01

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

私にとってはうまくいきますが、rstudioapiを使いたくなく、プロジェクトに参加していない場合は、パスに記号〜を使用できます。記号〜は、(少なくともWindowsでは)デフォルトの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-

BumbleBeeの回答(sys.frameの代わりにparent.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

実行するスクリプトがあるディレクトリへのパスを提供します。
Taz

2
pwdは現在の作業ディレクトリを表します。これは、シェルの現在のディレクトリが何であるかにディレクトリを設定します。
PeterVermont 2017

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 2017年

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ファイルのハンドラーとして登録しますが、.Rdataおよび.R拡張子のデフォルトの「関連付け」をRStudioに設定する機能についても言及されています。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で機能します(@nicoが指摘しているように、おそらくLinuxではありません。ただし、Linuxマシンがないため、これを確認できません)。
WetlabStudent 2014

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パッケージをインストールしてみてください。
ラモシー

それは奇妙です。32ビットUbuntu 14.04でR-3.2.4を使用しています。オペレーティングシステムやRのバージョンの違いによるものではないことを願っています
。– Lamothy

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.