실행 스크립트의 경로 결정


255

같은 디렉토리에있는 foo.R다른 스크립트를 포함 하는 스크립트 가 있습니다 other.R.

#!/usr/bin/env Rscript
message("Hello")
source("other.R")

그러나 현재 작업 디렉토리가 무엇이든 관계없이 R찾고 싶습니다 other.R.

즉, foo.R자체 경로를 알아야합니다. 어떻게해야합니까?


2
No. :( 실제로 작동하는 솔루션을 보지 못했습니다. 해결 방법 외에도 디렉토리를 전달하거나 환경 변수를 사용하는 해결 방법 외에도
Frank

3
심지어 R neofites가 스크립트를 완전히 이식 가능하고 실행 가능하게 만드는 것은 놀라운 일입니다!
Etienne Low-Décarie

4
모든 답변에 특정 시점에서 경로를 입력 해야하는 것처럼 보입니다 (적어도 파일을 소스로 지정)! 누군가에게 압축 폴더를 보내고 해당 폴더 내에서 R 스크립트 파일을 실행하면 해당 폴더를 읽고 저장할 수 있다면 좋을 것입니다.
Etienne Low-Décarie

10
이 단일 이슈는 실제로 내가 파이썬으로 완전히 이동할 수있는 이유가 될 수 있습니다.
Giacomo

5
@giac_man, R은 작업이 매우 어려워지는 것과 같은 수백 가지의 작은 문제로 가득 차 있다고 느낍니다.
Michael Barton

답변:


102

여기 에 문제에 대한 간단한 해결책이 있습니다. 이 명령은

script.dir <- dirname(sys.frame(1)$ofile)

현재 스크립트 파일의 경로를 반환합니다. 스크립트가 저장된 후에 작동합니다.


4
그것은 나를 위해 작동하지 않습니다. Windows에서 R을 실행합니다. 어떤 생각?
Ehsan88

4
저장된 scriptt과 함께 동일한 오류가 발생하고 새로 설치되어 Windows에서 R 3.2.0을 실행합니다.
RalfB

27
이 오류 dirname(sys.frame(1)$ofile)는 Rstudio에서 직접 실행하려고 할 때 발생합니다 . source ( "other.R")를 사용하여 스크립트를 실행하고 dirname(sys.frame(1)$ofile)내부에 있으면 정상적으로 작동합니다 "other.R".
Murta

4
rscript.exe를 사용하여 스크립트로 호출 할 때 '스택에 많은 프레임이 없습니다'오류가 발생했습니다. 즉 source ()를 사용하지 않습니다. 그래서 내가 대신 아래 Suppressingfire에서 솔루션을 사용했다
마크 아담 슨

3
NULL서버에 넣을 때 젤 을 뿌립니다. R을 사용할 때
Paul

75

commandArgs함수를 사용하여 Rscript가 전달한 모든 옵션을 실제 R 인터프리터로 가져 와서 검색 할 수 --file=있습니다. 스크립트가 경로에서 시작되었거나 전체 경로로 시작된 경우 script.name아래는로 시작됩니다 '/'. 그렇지 않으면cwd 전체 경로를 얻기 위해 두 경로를 연결할 수 있습니다.

편집 :script.name 위 의 내용 만 필요 하고 경로의 최종 구성 요소를 제거 하는 것처럼 들립니다 . 불필요한 cwd()샘플을 제거하고 기본 스크립트를 정리 하고 내을 게시했습니다 other.R. 이 스크립트와 other.R스크립트를 동일한 디렉토리에 저장 chmod +x하고 기본 스크립트를 실행하십시오.

main.R :

#!/usr/bin/env Rscript
initial.options <- commandArgs(trailingOnly = FALSE)
file.arg.name <- "--file="
script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])
script.basename <- dirname(script.name)
other.name <- file.path(script.basename, "other.R")
print(paste("Sourcing",other.name,"from",script.name))
source(other.name)

other.R :

print("hello")

출력 :

burner@firefighter:~$ main.R
[1] "Sourcing /home/burner/bin/other.R from /home/burner/bin/main.R"
[1] "hello"
burner@firefighter:~$ bin/main.R
[1] "Sourcing bin/other.R from bin/main.R"
[1] "hello"
burner@firefighter:~$ cd bin
burner@firefighter:~/bin$ main.R
[1] "Sourcing ./other.R from ./main.R"
[1] "hello"

이것이 내가 dehmann이 찾고 있다고 믿는 것입니다.


downmod는 무엇입니까?
Suppressingfire

2
sourceOP가 원한다고 생각 한대로 기술이 작동하지 않기 때문에 다운 모드가 되었지만 요구 사항을 잘못 읽었을 수 있습니다 . 그러나 나는 다운 모드를 풀 수 없습니다 :( 죄송합니다!
hadley November

그러나 실제로는 소스와 잘 작동합니다! source (other.name) 만 있으면 제대로 작동합니다.
Suppressingfire

3
경로 연결의 경우 사용하는 것이 좋습니다other.name <- file.path(script.basename, "other.R")
Jason

1
commandArgs(trailingOnly = FALSE)반짝이는 응용 프로그램에서 server.R 내부 를 실행하려고 하면 [1] "RStudio" "--interactive". 호출 된 디렉토리에 대한 정보가 없습니다.
Paul

57

R 콘솔에서 '소스'할 때 Suppressingfire의 솔루션을 작동시킬 수 없었습니다.
Rscript를 사용할 때 hadley의 솔루션을 사용할 수 없었습니다.

두 세계의 최고?

thisFile <- function() {
        cmdArgs <- commandArgs(trailingOnly = FALSE)
        needle <- "--file="
        match <- grep(needle, cmdArgs)
        if (length(match) > 0) {
                # Rscript
                return(normalizePath(sub(needle, "", cmdArgs[match])))
        } else {
                # 'source'd via R console
                return(normalizePath(sys.frames()[[1]]$ofile))
        }
}

6
R Rscriptsource()R 모두에서 작동하기 때문에 이것을 좋아합니다 normalizePath(). 두 버전 모두에서 작업 을 수행하는 것이 좋습니다 .
wch

1
이것이 유일하게 작동 한 것입니다. 참고 :이 작업을 수행하는 library(base)데 시간 이 걸렸습니다. lol
O.rka

2
이것이 나를 위해 일한 해결책이기 때문에 당신은 내 표를 얻습니다
Vince W.

1
이것이 원래 게시물의 누군가에게 도움이된다면의 의미 source(file.path(dirname(thisFile()), "other.R"))foo.R입니다. 이것은 나를 위해 작동합니다.
Kim

하나의 문제. main.R어떤 소스 helper.R를 호출 하는지 RStudio I 소스에서 가정하십시오 thisFile(). main.R대신 경로를 가져옵니다 helper.R. 여기 팁이 있습니까?
Wassadamo

37
frame_files <- lapply(sys.frames(), function(x) x$ofile)
frame_files <- Filter(Negate(is.null), frame_files)
PATH <- dirname(frame_files[[length(frame_files)]])

내가 잊어 버렸기 때문에 어떻게 작동하는지 묻지 마십시오.


2
어떤 맥락에서 작동합니까? print (sys.frames ())는 실행할 때 NULL을 나타냅니다.
Suppressingfire

1
@Suppressingfire : sys.frames호출 스택의 환경을 반환하므로 함수에서 호출 할 때만 의미가 있습니다. 예를 들어 foo <- function() {bar <- function() print(sys.frames()); bar()}; foo(). 환경에 ofile멤버 가 없기 때문에 @hadley의 코드를 알 수 없습니다 .
Richie Cotton

1
즉, 내가 다음 실행하는 코드를 저장하는 경우 - 당신의 파일 소스해야한다 source("~/code/test.r"), PATH로 설정됩니다 ~/desktop. 최상위 수준에서 평가하면 NULL을 반환합니다.
hadley

4
이것은 내 질문에 대답하지 않습니다. "other.R"파일을 자동으로 찾아야합니다.x$ofile정의되지 않았으므로 frame_files비어 있습니다.
Frank

@hadley, 매우 유용한 코드입니다. 현재 개발중인 거의 모든 스크립트에 추가하는 "현재 스크립트 다시로드"유틸리티 기능을 일반화 할 수있었습니다. RScript 리 로더
Sim

29

이것은 나를 위해 작동

library(rstudioapi)    
rstudioapi::getActiveDocumentContext()$path

4
이것은 RStudio 내부에서만 작동합니다. 터미널에서 시도하면 얻을 수 Error: RStudio not running있습니다.
Ista

더 구체적으로 R 스튜디오의 R 스크립트에서 실행하면 작동합니다. RStudio의 콘솔에서도 ""제 경우 에는 올바른 결과 를 얻지 못합니다
Kay

26

라켄시 의 답R 스크립트의 경로얻는 부터 가장 정확하고 정말 훌륭한 IMHO입니다. 그러나 여전히 더미 기능을 통합 한 핵입니다. 다른 사람들이 쉽게 찾을 수 있도록 여기에 인용하고 있습니다.

sourceDir <-getSrcDirectory (함수 (더미) {더미})

이것은 명령문이 배치 된 파일의 디렉토리를 제공합니다 (더미 함수가 정의 된 위치). 그런 다음 작업 direcory를 설정하고 상대 경로를 사용하는 데 사용할 수 있습니다.

setwd(sourceDir)
source("other.R")

또는 절대 경로를 만들려면

 source(paste(sourceDir, "/other.R", sep=""))

1
나를 위해, 당신의 솔루션이 최고였습니다. 특히 반짝이는 앱에 적용 할 수 있고 링크에없는 앱에 적용될 수 있기 때문입니다.
jcarlos

1
여기에 getSrcDirectory입니다 유틸 :: getSrcDirectory
RubenLaguna

5
이것은 Linux / Mac에서는 잘 작동하지만 Windows의 인터랙티브 RStudio 세션에서는 작동하지 않습니다. sourceDir비어있었습니다.
Contango

1
대화식 터미널의 @Contango에는 경로가 없습니다 !!! 파일 경로를 원합니다.
pommedeterresautee

1
을 받고 character(0)있습니다. 제안?
abalter

16

하나의 모든 것! (-RStudio 콘솔을 처리하도록 2019 년 1 월 1 일 업데이트 됨)

#' current script file (in full path)
#' @description current script file (in full path)
#' @examples
#' works with Rscript, source() or in RStudio Run selection, RStudio Console
#' @export
ez.csf <- function() {
    # http://stackoverflow.com/a/32016824/2292993
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript via command line
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName))
        } else {
            if (!is.null(sys.frames()[[1]]$ofile)) {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
            } else {
                # RStudio Run Selection
                # http://stackoverflow.com/a/35842176/2292993
                pth = rstudioapi::getActiveDocumentContext()$path
                if (pth!='') {
                    return(normalizePath(pth))
                } else {
                    # RStudio Console
                    tryCatch({
                            pth = rstudioapi::getSourceEditorContext()$path
                            pth = normalizePath(pth)
                        }, error = function(e) {
                            # normalizePath('') issues warning/error
                            pth = ''
                        }
                    )
                    return(pth)
                }
            }
        }
    }
}

대화식 R 세션에서는 작동하지 않습니다. 나는 다음을 얻는다 :```> source ( "csf.R")> csf () 오류 : RStudio가```를 실행하지 않습니다
ManicMailman

대단하다. 누군가 패키지를 만들 수 있습니까?
조 플랙

13

Supressingfire의 답변이 축소 된 변형 :

source_local <- function(fname){
    argv <- commandArgs(trailingOnly = FALSE)
    base_dir <- dirname(substring(argv[grep("--file=", argv)], 8))
    source(paste(base_dir, fname, sep="/"))
}

이것은 재귀 적으로 작동하지 않았다. 소스 파일은 데이터 파일을 찾습니다 (그러나 잘못된 디렉토리에 있음).
Unfun Cat

11

이것은 나를 위해 작동합니다. 명령 줄 인수에서 그것을 가져 와서 원하지 않는 텍스트를 제거하고 dirname을 수행 한 다음 마침내 그로부터 전체 경로를 얻습니다.

args <- commandArgs(trailingOnly = F)  
scriptPath <- normalizePath(dirname(sub("^--file=", "", args[grep("^--file=", args)])))

8

이 질문에 대한 답변을 rprojroot 의 새로운 함수 thisfile()마무리 하고 확장했습니다 . 와 뜨개질에도 작동합니다 knitr.


6

Steamer25의 솔루션이 내 목적에 가장 강력 해 보였으므로 마음에 들었습니다. 그러나 RStudio (Windows)에서 디버깅 할 때 경로가 올바르게 설정되지 않습니다. 그 이유는 RStudio에서 중단 점이 설정되어 있으면 파일을 소싱 할 때 스크립트 경로를 약간 다르게 설정하는 대체 "디버그 소스"명령을 사용하기 때문입니다. 다음은 디버깅 할 때 RStudio 내에서 대체 동작을 설명하는 현재 사용중인 최종 버전입니다.

# @return full path to this script
get_script_path <- function() {
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName)) 
        } else {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
        }
    }
}

Rstudio의 소스는 저에게 도움이되었지만 debugSource는 fileName을 제공하므로 솔루션은 잘 작동하지만 코드 주석은 제 경우에는 옳지 않습니다
Mark Adamson

6

나는이 질문에서 거의 모든 시도 에 R 스크립트의 경로를 얻기 , 현재 스크립트의 패스를 취득 , 현재 .R 파일의 위치 찾기Rstudio에서 소스 파일의 위치로 작업 디렉토리를 설정하기위한 R 명령을 했지만 결국 수동으로 나 자신을 발견 CRAN 테이블 찾아보기

scriptName 도서관

current_filename()RStudio에서 소싱하거나 R 또는 RScript 실행 파일을 통해 호출 할 때 스크립트의 올바른 전체 경로를 반환 하는 기능 을 제공 합니다.


1
Package ‘scriptName’ was removed from the CRAN repository.-지금 뭐야? : o
Bojan P.

3

나는 또한이 문제가 있었고 위의 해결책 중 어느 것도 나를 위해 일하지 않았다. 어쩌면 그와 source같은 것들이지만 아마도 명확하지 않았습니다.

나는 이것이 나에게 우아하다는 것을 발견했다.

paste0(gsub("\\", "/", fileSnapshot()$path, fixed=TRUE),"/")

중요한 점 fileSnapshot()은 파일에 대한 많은 정보를 제공 한다는 것입니다 . 8 개의 요소 목록을 반환합니다. path목록 요소로 선택 하면 경로가 \\구분 기호로 반환 되므로 나머지 코드는 경로 를 변경하는 것입니다.

이게 도움이 되길 바란다.


1
이것은 Linux 시스템에서 작동하지 않았습니다. 파일의 경로를 반환하는 대신 현재 위치한 디렉토리를 반환했습니다. 한 줄의 코드로 TEST.R이라는 테스트 스크립트를 만들었습니다. print (fileSnapshot () $ path)이 폴더에 저장했습니다. / 그런 다음 opt / home / boops / Desktop / Testfolder / TEST.RI가 데스크탑으로 이동하여 파일을 실행하려고했습니다. boops @ linuxserver : ~ / Desktop $ Rscript /opt/home/boops/Desktop/Testfolder/TEST.R [1 ] "/ opt / home / boops / Desktop"
Boops Boops

나에게도 효과가 없었습니다. 'here'라이브러리를 사용할 때 'here ()'와 동일한 것을 반환합니다. 현재 열려있는 R 프로젝트의 경로를 반환했지만 파일 자체는 실행되지 않았습니다.
조 플랙

2

r 스크립트를 bash 스크립트로 감싸고 다음과 같이 bash 변수로 스크립트 경로를 검색 할 수 있습니다.

#!/bin/bash
     # [environment variables can be set here]
     path_to_script=$(dirname $0)

     R --slave<<EOF
        source("$path_to_script/other.R")

     EOF

3
이를 위해서는 스크립트 경로가 있어야합니다. 어디에서나 실행할 수있는 이식성이 뛰어난 R 스크립트를 만들 수 없습니다.
Etienne Low-Décarie

@ EtienneLow-Décarie 스크립트 경로가 필요하지 않으며 bash에서 가져옵니다. 주요 문제는 경로를 얻는 신뢰할 수있는 방법이 아니라는 것입니다. 이런 식으로 뭔가를 같이 바람직하다 stackoverflow.com/questions/59895/... path_to_script = "$ (CD"$ (dirname은 "$ {BASH_SOURCE [0]}") "&& PWD)"
존 Haberstroh

2

나는이 접근법을 좋아한다 :

this.file <- sys.frame(tail(grep('source',sys.calls()),n=1))$ofile
this.dir <- dirname(this.file)

2

방금 직접 해결했습니다. 스크립트의 이식성을 보장하려면 항상 다음으로 시작하십시오.

wd <- setwd(".")
setwd(wd)

"."때문에 작동합니다. 유닉스 명령 $ PWD와 같이 번역합니다. 이 문자열을 문자 객체에 할당하면 해당 문자 객체를 setwd () 및 Presto에 삽입 할 수 있습니다 코드는 기계의 위치 나 파일 구조의 위치에 관계없이 항상 현재 디렉토리를 작업 디렉토리로 실행합니다. 위치. (추가 보너스 : wd 객체는 file.path () (예 : file.path (wd, "output_directory")와 함께 사용하여 명명 된 디렉토리로 이어지는 파일 경로에 관계없이 표준 출력 디렉토리를 만들 수 있습니다. 이를 위해서는이 방법으로 참조하기 전에 새 디렉토리를 만들어야하지만 wd 객체로도 도움이 될 수 있습니다.

또는 다음 코드는 똑같은 작업을 수행합니다.

wd <- getwd()
setwd(wd)

또는 객체에 파일 경로가 필요하지 않은 경우 간단히 다음을 수행 할 수 있습니다.

setwd(".")

11
아니. 파일 자체가 아닌 프로세스 디렉토리를 찾습니다.
user1071847

이것은 대화 형 모드의 RStudio가있는 Windows에서 나에게 효과적이었습니다.
Contango

2

getopt 패키지는 get_Rscript_filename여기에 제시된 것과 동일한 솔루션을 사용하지만 표준 R 모듈로 이미 작성된 기능을 제공하므로 "스크립트 경로 가져 오기"기능을 복사하여 모든 스크립트에 붙여 넣을 필요는 없습니다. 당신은 쓰기.


출력을 인쇄하는 스크립트를 작성하고 다음과 같이 스크립트를 호출하더라도 항상 NA를 반환합니다.R -e "library(getopt); testscript.R"
bokov

1
함수 이름에서 알 수 있듯이을 사용하여 스크립트를 실행해야합니다 Rscript.
Ryan C. Thompson

아 죄송합니다. 감사.
bokov

1

참조 findSourceTraceback()R.utils의 , 포장하는

모든 호출 프레임에서 source ()에 의해 생성 된 모든 'srcfile'객체를 찾습니다. 이를 통해 source ()가 현재 어떤 파일을 스크립팅했는지 확인할 수 있습니다.


1

내 스크립트가 심볼릭 링크 디렉토리에서 작동 할 때 위의 구현에 문제가 있거나 적어도 위의 솔루션이 효과가 없다고 생각합니다. @ennuikiller의 대답을 따라 Rscript를 bash로 감쌌습니다. pwd -P심볼 링크 된 디렉토리 구조를 해결하는을 사용하여 경로 변수를 설정했습니다 . 그런 다음 경로를 Rscript로 전달하십시오.

Bash.sh

#!/bin/bash

# set path variable
path=`pwd -P`

#Run Rscript with path argument
Rscript foo.R $path

foo.R

args <- commandArgs(trailingOnly=TRUE)
setwd(args[1])
source(other.R)

1

@ steamer25 방식의 변형을 사용합니다. 요점은 세션이 Rscript를 통해 시작된 경우에도 마지막 소스 스크립트를 얻는 것을 선호한다는 것입니다. 다음 스 니펫은 파일에 thisScript포함 된 경우 스크립트의 정규화 된 경로를 포함 하는 변수 를 제공합니다 . 소스의 사용을 고백하기 때문에 때때로 Rscript를 호출하고 --file인수에 제공된 스크립트가 다른 스크립트를 제공하는 다른 스크립트를 제공합니다. 언젠가는 지저분한 코드를 패키지로 만드는 데 투자 할 것입니다.

thisScript <- (function() {
  lastScriptSourced <- tail(unlist(lapply(sys.frames(), function(env) env$ofile)), 1)

  if (is.null(lastScriptSourced)) {
    # No script sourced, checking invocation through Rscript
    cmdArgs <- commandArgs(trailingOnly = FALSE)
    needle <- "--file="
    match <- grep(needle, cmdArgs)
    if (length(match) > 0) {
      return(normalizePath(sub(needle, "", cmdArgs[match]), winslash=.Platform$file.sep, mustWork=TRUE))
    }
  } else {
    # 'source'd via R console
    return(normalizePath(lastScriptSourced, winslash=.Platform$file.sep, mustWork=TRUE))
  }
})()

1

당신이 단순히 사용할 수있는 경우의 99 % :

sys.calls()[[1]] [[2]]

스크립트가 첫 번째 인수가 아닌 미친 전화에는 작동하지 않습니다 source(some args, file="myscript"). 이 멋진 경우에는 @hadley를 사용하십시오.


그러나 소싱 할 때를 제외하고는 RStudio 내에서 제공되지 않음
nJGL

1

Steamer25의 접근 방식은 작동하지만 경로에 공백이없는 경우에만 작동합니다. macOS에서는 적어도 for cmdArgs[match]와 같은 것을 반환 /base/some~+~dir~+~with~+~whitespace/합니다 /base/some\ dir\ with\ whitespace/.

이 문제를 해결하기 전에 "~ + ~"를 간단한 공백으로 바꾸어이 문제를 해결했습니다.

thisFile <- function() {
  cmdArgs <- commandArgs(trailingOnly = FALSE)
  needle <- "--file="
  match <- grep(needle, cmdArgs)
  if (length(match) > 0) {
    # Rscript
    path <- cmdArgs[match]
    path <- gsub("\\~\\+\\~", " ", path)
    return(normalizePath(sub(needle, "", path)))
  } else {
    # 'source'd via R console
    return(normalizePath(sys.frames()[[1]]$ofile))
  }
}

분명히 aprstar처럼 else 블록을 확장 할 수 있습니다.


1

스크립트 대신 foo.R경로 위치를 알고 있다면 모든 source공통 경로 를 항상 참조하도록 코드를 변경할 root수 있다면 큰 도움이 될 수 있습니다.

주어진

  • /app/deeply/nested/foo.R
  • /app/other.R

이 작동합니다

#!/usr/bin/env Rscript
library(here)
source(here("other.R"))

프로젝트 루트를 정의하는 방법 은 https://rprojroot.r-lib.org/ 를 참조 하십시오 .


나를 위해 여기 패키지는 정확히 일을하고 쉬운 해결책 인 것 같습니다
Ron

0
#!/usr/bin/env Rscript
print("Hello")

# sad workaround but works :(
programDir <- dirname(sys.frame(1)$ofile)
source(paste(programDir,"other.R",sep='/'))
source(paste(programDir,"other-than-other.R",sep='/'))

나는 여전히 오류 얻을 "sys.frame (1)의 오류 :하지 그 스택에 많은 프레임"
마이클 바튼

0

R에는 '$ 0'유형 구조가 없습니다! R로 작성된 bash 스크립트에 대한 system () 호출로이를 수행 할 수 있습니다.

write.table(c("readlink -e $0"), file="scriptpath.sh",col=F, row=F, quote=F)
thisscript <- system("sh scriptpath.sh", intern = TRUE)

그런 다음 다른 scriptpath.sh 이름을 분리하십시오.

splitstr <- rev(strsplit(thisscript, "\\/")[[1]])
otherscript <- paste0(paste(rev(splitstr[2:length(splitstr)]),collapse="/"),"/other.R")

오류 메시지가 나타납니다readLink: illegal option -- e usage: readLink [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
altabq

0

호출 스택을 보면 실행중인 각 스크립트의 파일 경로를 얻을 수 있습니다. 가장 유용한 두 가지는 아마도 현재 실행중인 스크립트이거나 소스가 될 첫 번째 스크립트 일 것입니다.

script.dir.executing = (function() return( if(length(sys.parents())==1) getwd() else dirname( Filter(is.character,lapply(rev(sys.frames()),function(x) x$ofile))[[1]] ) ))()

script.dir.entry = (function() return( if(length(sys.parents())==1) getwd() else dirname(sys.frame(1)$ofile) ))()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.