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
'development' 카테고리의 다른 글
오류 : 원인 : buildToolsVersion이 지정되지 않았습니다. (0) | 2020.12.08 |
---|---|
파이썬에 중첩 될 수있는 정적 블록의 수에 제한이있는 이유는 무엇입니까? (0) | 2020.12.08 |
NSString과 함께 printf를 사용하는 방법 (0) | 2020.12.08 |
요청 라이브러리를 사용하는 Python 앱 단위 테스트 (0) | 2020.12.08 |
Heroku에서 PostgreSQL의 내장 전체 텍스트 검색을 사용하지 않는 이유는 무엇입니까? (0) | 2020.12.08 |