development

R 스크립트의 경로 얻기

big-blog 2020. 12. 8. 18:55
반응형

R 스크립트의 경로 얻기


스크립트 자체 내에서 R 스크립트의 경로를 프로그래밍 방식으로 찾는 방법이 있습니까?

RGtk2.glade 파일에서 GUI 를 사용 하고로드하는 여러 스크립트가 있기 때문에 이것을 묻습니다 .

이 스크립트에서는 setwd("path/to/the/script")처음에 지침 을 입력해야합니다 . 그렇지 않으면 동일한 디렉토리에있는 .glade 파일을 찾을 수 없습니다.

괜찮지 만 스크립트를 다른 디렉토리 나 다른 컴퓨터로 옮기면 경로를 변경해야합니다. 나는 큰 문제는 아니지만 다음과 같은 것을 갖는 것이 좋을 것입니다.

setwd(getScriptPath())

그렇다면 비슷한 기능이 있습니까?


사용하다 source("yourfile.R", chdir = T)


이것은 나를 위해 작동합니다.

getSrcDirectory(function(x) {x})

이것은 스크립트 내부에 익명 함수 (아무것도하지 않음)를 정의한 다음 해당 함수의 소스 디렉토리 (스크립트가있는 디렉토리)를 결정합니다.


RStudio 전용 :

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

이것은 파일을 실행 하거나 소싱 할 때 작동 합니다.


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

코드를 패키지로 래핑하면 항상 패키지 디렉토리의 일부를 쿼리 할 수 ​​있습니다.
다음은 RGtk2 패키지의 예입니다.

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

설치된 패키지 inst/glade/의 디렉토리가 될 소스 의 디렉토리 동일한 작업을 수행 할 수 있으며 OS에 관계없이 설치시 경로를 계산합니다.glade/system.file()


이 대답은 나에게 잘 작동합니다.

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 문서에서 그것에 대해 아무것도 찾지 못했습니다. 누군가 그것을 설명 할 수 있습니까?


#' 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
}

How about using system and shell commands? With the windows one, I think when you open the script in RStudio it sets the current shell directory to the directory of the script. You might have to add cd C:\ e.g or whatever drive you want to search (e.g. shell('dir C:\\*file_name /s', intern = TRUE) - \\ to escape escape character). Will only work for uniquely named files unless you further specify subdirectories (for Linux I started searching from /). In any case, if you know how to find something in the shell, this provides a layout to find it within R and return the directory. Should work whether you are sourcing or running the script but I haven't fully explored the potential bugs.

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

Thank you for the function, though I had to adjust it a Little as following for me (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
}

참고URL : https://stackoverflow.com/questions/3452086/getting-path-of-an-r-script

반응형