web-dev-qa-db-ja.com

Rスクリプトのパスを取得する

スクリプト自体の内部でRスクリプトのパスをプログラムで見つける方法はありますか?

_RGtk2_を使用して.gladeファイルからGUIをロードするスクリプトがいくつかあるため、これを求めています。

これらのスクリプトでは、setwd("path/to/the/script")命令を先頭に配置する必要があります。そうしないと、同じディレクトリにある.gladeファイルが見つかりません。

これは問題ありませんが、スクリプトを別のディレクトリまたは別のコンピューターに移動する場合、パスを変更する必要があります。大したことではありませんが、次のようなものがあればいいと思います。

setwd(getScriptPath())

それで、同様の機能が存在しますか?

59
nico

source("yourfile.R", chdir = T)を使用します

25
hadley

これは私のために働く:

getSrcDirectory(function(x) {x})

これにより、スクリプト内で匿名関数(何も行わない)が定義され、その関数のソースディレクトリ(スクリプトがあるディレクトリ)が決定されます。

37
rakensi

RStudioのみ:

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

これはRun ningまたはSource ingの場合に機能します。

26
Richie Cotton

Rscriptの暗黙的な「--file」引数を活用する

「Rscript」( Rscript doc )を使用してスクリプトを呼び出す場合、スクリプトの完全なパスがシステムパラメーターとして指定されます。次の関数は、これを利用してスクリプトディレクトリを抽出します。

getScriptPath <- function(){
    cmd.args <- commandArgs()
    m <- regexpr("(?<=^--file=).+", cmd.args, Perl=TRUE)
    script.dir <- dirname(regmatches(cmd.args, m))
    if(length(script.dir) == 0) stop("can't determine script dir: please call the script with Rscript")
    if(length(script.dir) > 1) stop("can't determine script dir: more than one '--file' argument detected")
    return(script.dir)
}
6

コードをパッケージにラップすると、パッケージディレクトリの一部をいつでも照会できます。
RGtk2パッケージの例を次に示します。

_> system.file("ui", "demo.ui", package="RGtk2")
[1] "C:/opt/R/library/RGtk2/ui/demo.ui"
> 
_

ソースのディレクトリ_inst/glade/_でも同じことができ、インストールされたパッケージのディレクトリ_glade/_になります。また、system.file()は、インストール時に、パスを計算します。 OS。

4

この答えは私にはうまくいきます:

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-

しかし、私はまだsys.frame(1)$ ofileとは何かを理解していません。 Rドキュメンテーションにはそれについて何も見つかりませんでした。誰かがそれを説明できますか?

3
sietemonos
#' current script dir
#' @param
#' @return
#' @examples
#' works with source() or in RStudio Run selection
#' @export
z.csd <- function() {
    # http://stackoverflow.com/questions/1815606/rscript-determine-path-of-the-executing-script
    # must work with source()
    if (!is.null(res <- .thisfile_source())) res
    else if (!is.null(res <- .thisfile_rscript())) dirname(res)
    # http://stackoverflow.com/a/35842176/2292993  
    # RStudio only, can work without source()
    else dirname(rstudioapi::getActiveDocumentContext()$path)
}
# Helper functions
.thisfile_source <- function() {
    for (i in -(1:sys.nframe())) {
        if (identical(sys.function(i), base::source))
            return (normalizePath(sys.frame(i)$ofile))
    }

    NULL
}
.thisfile_rscript <- function() {
    cmdArgs <- commandArgs(trailingOnly = FALSE)
    cmdArgsTrailing <- commandArgs(trailingOnly = TRUE)
    cmdArgs <- cmdArgs[seq.int(from=1, length.out=length(cmdArgs) - length(cmdArgsTrailing))]
    res <- gsub("^(?:--file=(.*)|.*)$", "\\1", cmdArgs)

    # If multiple --file arguments are given, R uses the last one
    res <- tail(res[res != ""], 1)
    if (length(res) > 0)
        return (res)

    NULL
}
1
Jerry T

システムおよびシェルコマンドを使用してはどうですか? Windows 1では、RStudioでスクリプトを開くと、現在のシェルディレクトリがスクリプトのディレクトリに設定されると思います。 cd C:\ e.gまたは検索するドライブを追加する必要がある場合があります(例:Shell( 'dir C:\\ * file_name/s'、intern = TRUE)-\\エスケープ文字をエスケープするには)。サブディレクトリをさらに指定しない限り、一意の名前のファイルに対してのみ機能します(Linuxの場合は/から検索を開始しました)。いずれにせよ、シェルで何かを見つける方法を知っていれば、これはR内でそれを見つけてディレクトリを返すレイアウトを提供します。スクリプトを調達するか実行するかに関係なく動作するはずですが、潜在的なバグを完全には調査していません。

#Get operating system
OS<-Sys.info()
win<-length(grep("Windows",OS))
lin<-length(grep("Linux",OS))

#Find path of data directory
#Linux Bash Commands
if(lin==1){
  file_path<-system("find / -name 'file_name'", intern = TRUE)
  data_directory<-gsub('/file_name',"",file_path)
}
#Windows Command Prompt Commands
if(win==1){
  file_path<-Shell('dir file_name /s', intern = TRUE)
  file_path<-file_path[4]
  file_path<-gsub(" Directory of ","",file_path)
  filepath<-gsub("\\\\","/",file_path)
  data_directory<-file_path
}

#Change working directory to location of data and sources  
setwd(data_directory)
0
WJ2016

この機能をありがとう、私は次のように少し調整する必要がありました(W10):

#Windows Command Prompt Commands
if(win==1){
  file_path<-Shell('dir file_name', intern = TRUE)
  file_path<-file_path[4]
  file_path<-gsub(" Verzeichnis von ","",file_path)
  file_path<-chartr("\\","/",file_path)
  data_directory<-file_path
}