web-dev-qa-db-ja.com

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

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

enter image description here

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

111
Stat-R

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

setwd(getSrcDirectory()[1])

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

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

もちろん、この2番目のソリューションでは、RStudioをIDEとして使用する必要があります。

50
Richie Cotton

私はこの質問が時代遅れであることを知っていますが、私はそれに対する解決策も探していました、そして、Googleはこれを一番上にリストしました:

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

それをファイルのどこかに入れて(ただし、最初がベスト)、そのファイルに従ってwdが変更されるようにします。

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

`source`dファイルのファイル名とパスを取得 も参照してください

61
BumbleBee

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%確認できるようにパスを印刷していますが、これはオプションです。

6
gagarine

この答えは次の場合に役立ちます。

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
sietemonos
dirname(rstudioapi::getActiveDocumentContext()$path)

私のために動作しますが、rstudioapiを使用したくない場合で、あなたがproyectにいない場合は、パスでシンボル〜を使用できます。記号〜は、デフォルトのRStudio作業ディレクトリを指します(少なくともWindowsでは)。

RStudio options

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
Juan Pueyo

ソリューション

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])
5
namu.net

私はこれが古いスレッドであることを認識していますが、作業ディレクトリを設定する必要があるという同様の問題があり、解決策を得ることができませんでした。他の誰かが後でこれに出くわした場合に、ここでうまくいったことがあります:

# 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を実行する必要があったため、最終的にどのディレクトリになるかを知る方法がありませんでした(ジョブには番号と計算ノードが割り当てられます)。これは私のためにトリックをしました。

3
Katie Renwick

この問題の解決策を探していたところ、このページに来ました。私はその日付は知っていますが、以前の解決策では満足できないか、うまくいきませんでした。興味があれば私の回避策を紹介します。

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)
3
Ryan Liebert

私はこれが時代遅れであることを理解していますが、以前の回答を非常に満足に機能させることはできなかったので、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"のようになります。これが動けなくなるかもしれない他の誰にも役立つことを願っています。

2
Tgsmith61591

Linuxで作業している場合、これを試すことができます。

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

わたしにはできる。

2
Taz

ほとんどのGUIは、ディレクトリにいて、.Rファイルを「開く」、ダブルクリックする、または実行しようとすると、特に指定がない限り、それが存在するディレクトリが作業ディレクトリであると想定します。 Mac GUIには、実行中のセッションで設定し、次の「起動」で有効になる環境設定の「起動」パネルで変更可能なデフォルトの動作を変更する方法が用意されています。以下もご覧ください。

?Startup

RStudioのドキュメントには次のように書かれています:

「ファイルの関連付けによって起動されると、RStudioは作業ディレクトリを開いているファイルのディレクトリに自動的に設定します。」デフォルト設定では、RStudioを.Rファイルのハンドラーとして登録しますが、.Rdataおよび.R拡張子に対してRStudioとのデフォルトの「関連付け」を設定する機能についても言及しています。 Linuxで「ハンドラ」ステータスと「アソシエーション」ステータスが同じであるかどうかはわかりません。

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

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

私にとっても動作しませんが、次の( https://stackoverflow.com/a/35842176/992088 で提案されているように)ubuntu 14.04で動作します

dirname(rstudioapi::getActiveDocumentContext()$path)
0
Lamothy

UTF-8エンコードを使用する場合:

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

Rstudioapiパッケージをまだインストールしていない場合は、インストールする必要があります。

0
jormaga

here パッケージは、here()関数を提供します。この関数は、ヒューリスティックに基づいてプロジェクトのルートディレクトリを返します。

スクリプトの場所が見つからないため、完璧なソリューションではありませんが、いくつかの目的には十分であるため、ここに配置すると思いました。

0
Will