2017-12-21 1 views
2

소스가 지정되어있을 때 스크립트가 interactive()을 사용하여 대화식으로 실행되는지 확인하는 스크립트가 작성되었습니다. 대화 형으로 실행되는 경우 명령 줄 인수를 검색하지 않습니다. 그러나 대화식으로 실행되지 않으면 명령 줄 인수를 검색하여 오류가 발생합니다.Rscript는 R 스크립트가 다른 스크립트에서 호출/소스되고 있는지 확인합니다.

일반적으로 정상적으로 작동하지만 때로는 일부 데이터를 처리하기 위해 독립적으로 실행하려는 두 번째 R 스크립트를 작성합니다. 따라서 Script2는 Script1을 소스로 사용하고 Script1은 대화식으로 실행되지 않음을 감지하고 명령 줄 인수를 찾고 오류를 던지기 시작합니다.

interactive() 외에도 스크립트가 해당 컨텍스트를 감지 할 수있는 방법이 있습니까? 예를 들어 직접 실행될 때와 내부 함수 중 하나에 액세스하기 위해로드 될 때 별도의 동작을 원합니다. 패키지를 사용하면 dplyr::arrange()과 같은 것을 수행하여에 액세스 할 수 있으며 모든 dplyr을로드 할 필요가 없습니다.

편집 : 나의 현재 매우는 janky 해결 기능을 저장 save.image()를 사용하여 대화 형 세션, 소스 script1이를 시작하고, 다음 Script2에 저장된으로 .rdata 파일을로드 load를 사용하고있다. 그러나 분명히 이것은 우아한 것이 아닙니다.


나는

이 예제 코드를 박탈 ... 내가 사용하는 정확한 코드가 관련이 있다고 생각하지만, 경우 누군가에 포함하면이 대답하는 것이 중요 느낌하지 않습니다

#!/usr/bin/env Rscript 

library(optparse) 

function1 <- function(etc,etc) {} 
function2 <- function(etc,etc) {} 

if(!interactive()) { 

    # example call 
    # Rscript create_reference_file.R -c cd4cd8 -o /home/outputfolder/ 

    option_list = list(
     make_option(c('-c', '--cell'), type = 'character', default = NULL, 
        help = 'the name of the cell', 
        metavar = 'character'), 
     make_option(c('-o','--outdir'), type = 'character', default = NULL, 
        help = 'the location where you wish to store your output', 
        metavar = 'character'), 
    ) 

    opt_parser <- OptionParser(option_list = option_list) 
    opt <- parse_args(opt_parser) 

    function1(opt); function2(opt) # etc etc, I do stuff with the opt inputs 
} 
+1

파이썬의'if __name__ == '__main __':'과 비슷한 것을 찾고 계십니까? – r2evans

+0

(파이썬을 사용하지 않는다면, 참고 문헌에 대한 배경이 있습니다 : https://stackoverflow.com/questions/419163/what-does-if-name-main-do) – r2evans

+0

예! 그것은 기본적으로 (또는 비슷한 결과를 얻을 수있는) 찾고있는 것과 동일한 기능입니다. – Brandon

답변

1

나는 당신의 해결보다는 약간 덜 는 janky의 ... 해킹으로이 밖으로 던질거야,하지만 스크립트 KNO를 보내고 전화 에 의존 날개 무엇 ed 스크립트에 대한 테스트 중입니다.

BEING_SOURCED_FROM_SOMEWHERE <- TRUE 

다음 호출 에드 스크립트가 그것을 확인할 수 있습니다 :

function1 <- function(etc,etc) {} 
function2 <- function(etc,etc) {} 

if (! exists("BEING_SOURCED_FROM_SOMEWHERE")) { 
    library(optparse) 
    # ... 
} 

나는 그것을 좋아하지 않아

전화 스크립트를 보내고 경우

변수를 설정합니다. 그것은 파이썬의

if __name__ == "__main__": 
    import optparse 
    # ... 

만큼 유연하지하지만 내가 함수 정의에 대한 saveload의 사용 그것보다 덜 싫어하는 생각합니다.

편집

좋아, 이것은 더 많은 파이썬의 __name__ 트릭과 같다.

function1 <- function(etc,etc) {} 
function2 <- function(etc,etc) {} 

if (sys.nframe() == 0L) { 
    library(optparse) 
    # ... 
} 

그것은 하나의 희망 수 있기 미니멀로, 그것에 대해 아무것도 알 수 있도록 source 보내고 스크립트를 필요로하지 않습니다에 대해, 그리고 중첩 된 경우에도 잘 작동하는 것 같다.

Rscript: Determine path of the executing script마다 스크립트 이름을 보면 다른 가능한 메커니즘을 사용할 수 있습니다 (추가 기능 필요). 그럴듯한 (아주 좋은) 솔루션이 많이 있지만, 모든 패키지에는 기본 패키지 (또는 출처가되는 스크립트에 포함 된 간단한 코드)에 정의되지 않은 미리 정의 된 기능이 필요합니다. "패키지 X가 설치되었다고 가정합니다."라고 가정하면 스크립트는 잠재적으로 비 호환성이됩니다.

+0

BTW : 다른 사람들이보다 세련된 해결책을 갖고 있는지 원래 질문 * 스튜를 조금이라도 알려주도록하십시오. 너가 그것을 너무 빨리 받아들이면, 다른 응답자는 질문조차 읽지 않을지도 모르다. :-) – r2evans

+0

아마도 @DirkEddelbuettel에는 ['littler'] (http://dirk.eddelbuettel.com/code/littler.html) 유틸리티 내에 뭔가가 있습니까? – r2evans

+0

완벽하지는 않지만 확실히 전에 올바른 방향으로 나아갔습니다. – Brandon

관련 문제