私はRでいくつかのチュートリアルを作成しています。各Rコードは特定のフォルダーに含まれています。そこにはデータファイルやその他のファイルがあります。.r
以下に示すように、Rstudioの作業ディレクトリを変更する必要がないように、ファイルを開いてソースを作成します。
Rで作業ディレクトリを自動的に指定する方法はありますか?
私はRでいくつかのチュートリアルを作成しています。各Rコードは特定のフォルダーに含まれています。そこにはデータファイルやその他のファイルがあります。.r
以下に示すように、Rstudioの作業ディレクトリを変更する必要がないように、ファイルを開いてソースを作成します。
Rで作業ディレクトリを自動的に指定する方法はありますか?
ソースとなるスクリプトの場所を取得するには、utils::getSrcDirectory
またはを使用できますutils::getSrcFilename
。したがって、作業ディレクトリを現在のファイルのディレクトリに変更するには、次のようにします。
setwd(getSrcDirectory()[1])
コードをソース化するのではなく実行する場合、これはRStudioでは機能しません。そのためには、を使用する必要があります。rstudioapi::getActiveDocumentContext
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
もちろん、この2番目のソリューションでは、IDEとしてRStudioを使用している必要があります。
私はこの質問が時代遅れであることを知っています、しかし私はそれに対する解決策も探していました、そしてグーグルはこれを一番上にリストします:
this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)
それをファイルのどこかに置き(ただし、最初が最適です)、そのファイルに応じてwdが変更されます。
コメントによると、これは必ずしもすべてのプラットフォームで機能するとは限りません(Windowsは機能しているようですが、一部のプラットフォームではLinux / Macが機能しているようです)。このソリューションはファイルを「ソーシング」するためのものであり、必ずしもそのファイルでチャンクを実行するためのものではないことに注意してください。
`source`dファイルのファイル名とパスを取得するも参照してください
dirname(rstudioapi::getActiveDocumentContext()$path)
私にとってはうまくいきますが、 rstudioapiを使用したくなく、プロジェクトに参加していない場合は、パスに記号〜を使用できます。記号〜は、デフォルトのRStudio作業ディレクトリ(少なくともWindowsでは)を示します。
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")
これは、使用しているコンピューターに関係なく、スクリプトをコーディングするための最良の方法です。
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%確認しますが、これはオプションです。
この答えは役に立ちます:
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を使用)は私には機能しませんでした。常にエラーが発生します。
ソリューション
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])
Linuxで作業している場合は、次のことを試すことができます。
setwd(system("pwd", intern = T) )
わたしにはできる。
これは古いスレッドであることに気付きましたが、作業ディレクトリを設定する必要があるという同様の問題があり、どのソリューションも機能しませんでした。後で誰かがこれに遭遇した場合に備えて、うまくいったことは次のとおりです。
# 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を実行する必要があったため、最終的にどのディレクトリに配置されるかを知る方法がありませんでした(ジョブには番号と計算ノードが割り当てられます)。これは私にとってトリックでした。
このhere
パッケージは、here()
いくつかのヒューリスティックに基づいてプロジェクトのルートディレクトリを返す関数を提供します。
スクリプトの場所が見つからないため、完璧な解決策ではありませんが、目的によっては十分なので、ここに配置すると思いました。
これは時代遅れだと理解していますが、前者の回答を十分に機能させることができなかったので、他の誰かが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"
。これが行き詰まったかもしれない他の誰かに役立つことを願っています。
私はちょうどこの問題の解決策を探していました、このページに来ました。私はその日付を知っていますが、以前の解決策では満足できないか、うまくいきませんでした。興味があれば、これが私の回避策です。
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)
UTF-8エンコーディングを使用する場合:
path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))
まだインストールしていない場合は、パッケージrstudioapiをインストールする必要があります。
ほとんどのGUIは、ディレクトリ内にいて「開く」、ダブルクリックする、またはその他の方法で.Rファイルを実行しようとすると、特に指定がない限り、そのディレクトリが存在するディレクトリが作業ディレクトリになると想定します。Mac GUIは、実行中のセッションで設定した[設定]の[スタートアップ]パネルで変更可能で、次の「起動」時に有効になるデフォルトの動作を変更する方法を提供します。また、次のことも確認する必要があります。
?Startup
RStudioのドキュメントには次のように書かれています。
「ファイルの関連付けを介して起動すると、RStudioは作業ディレクトリを開いたファイルのディレクトリに自動的に設定します。」デフォルトの設定では、RStudioを.Rファイルのハンドラーとして登録しますが、.Rdataおよび.R拡張子のRStudioとのデフォルトの「関連付け」を設定する機能についても言及されています。Linuxで「ハンドラー」ステータスと「アソシエーション」ステータスが同じかどうかはわかりません。
dirname(parent.frame(2)$ofile)
私にとっても機能しませんが、以下(https://stackoverflow.com/a/35842176/992088で提案されているように)はubuntu14.04で私のために機能します
dirname(rstudioapi::getActiveDocumentContext()$path)
これを行う別の方法は次のとおりです。
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()
私はあざける鳥のように感じます、しかし私はそれを言うつもりです:私はこのポストが古いことを知っています、しかし...
最近、タスクスケジューラと.batファイルからスクリプトを実行するときにAPIを呼び出せないことを知りました。私はこれを難しい方法で学びました。rstudioapi ::メソッドのいずれかを使用していた人は、それを知りたいと思うかもしれません。この方法で多くのスクリプトを一晩実行します。つい最近、パスを変更して、呼び出されたapiを含め、作業ディレクトリを「動的に」設定できるようにしました。次に、タスクスケジューラからトリガーされたときに最初に試したものが失敗したとき、調査によってその情報がもたらされました。
これは、この問題を明らかにした実際のコードです:
setwd(dirname(rstudioapi :: getActiveDocumentContext()$ path))
ただし、スクリプトを実行している場合は、美しく機能します。
人々がまだこれらのスレッドを引き上げていることを知っているので、私の2セントを追加するだけで、それが役立つかもしれないと思いました。