2017-11-08 12 views
1

어떻게 함수, 인수 및 해당 반환 값의 이름을 프로그래밍 방식으로 파싱 할 수 있습니까?R 함수 이름, 인수 및 반환 값 구문 분석

drakepackage으로 R 데이터 분석 워크 플로를 자동화하기위한 작업 계획 데이터 프레임을 생성하는 데 관심이 있습니다. workplan 함수를 사용하여 그러한 작업 계획 데이터 프레임을 생성 할 수 있습니다.

나는 내가 쓰고 싶은 기능을 가진 R 스크립트를 가지고있다. 예 :

funA <- function(x){ 
    y <- x + 2 
    y 
} 

funB <- function(y){ 
    z <- y^2 
    z 
} 

그리고 아래와 같이 데이터 프레임을 프로그래밍 방식으로 생성하고 싶습니다. 함수 이름, 인수 및 반환 값을 구문 분석하고 drake::workplan 또는 다른 함수와 함께 data.frame을 어떻게 만들 수 있습니까?

my_plan <- drake::workplan(z=funB(5), y=funA(3)) 

을 그리고 그와 워크 플로우 실행 :

target command 
1  y funA(5)  
2  z funB(3)  

하나 같이 손으로이 작업을 수행 할 것

drake::make(my_plan) 

당신을 감사합니다.

+1

원시 스크립트 텍스트 파일을 실행하지 않고 구문 분석 하시겠습니까? 아니면 활성 R 세션에로드하는 이러한 개체입니까? – MrFlick

+0

@MrFlick :'source ("functions.R")'와 같은 일을함으로써 현재 활성화 된 R 세션에로드하고있는 객체를 파싱하고 싶습니다. – ropolo

+1

특정 파일에 대한 소스 코드 분석을 실제로하고 싶다면'parse ("functions.R")'을 살펴보십시오. 나는 여전히 당신이하려고하는 것이 조금 어색하다고 생각하지만, 당신에게 실질적인 힌트를주기에는 드레이크에 대해 충분히 알지 못합니다 :/ –

답변

2

당신은 또한 함수의 이름을 볼 수있는 방법이 없습니다 body()environment()

와 함수의 몸과 환경을 추출 할 수 있습니다 formals()

funA <- function(x, b = "default"){ 
    y <- x + 2 
    y 
}  
formals(funA) 

과 인수를 얻을 수 있습니다. 함수에 실제로 이름이 없으면 이름이 일 때을 참조합니다 (이름을 모르는 경우 참조 할 내용을 어떻게 알 수 있습니까?).

반환 값을 가져올 방법이 없습니다. 귀하의 예제에서 함수의 body()을 수동으로 구문 분석하여 zy을 얻을 수 있지만이라는 매우 나쁜 아이디어 인 이며 이는 특정 방식으로 함수 소스를 작성하는 경우에만 작동합니다. 네가 이렇게해도, 그건 의미가 없다. zy은 함수가 반환 될 때 파괴됩니다.

왜 반환 값과 함수 이름이 필요한지 정확히 설명 할 수 있습니다. 달성하려는 목표를 달성하는 또 다른 방법이있을 것입니다.

library(purrr) 
library(dplyr) 

fenv <- new.env() 
parse("test.r") %>% 
    keep(is.language) %>% 
    keep(~grepl(", function", toString(.x))) %>% 
    map(eval, envir=fenv) %>% 
    map_df(~{ 
    params <- list(names(formals(.x))) 
    bdy <- deparse(body(.x)) 
    bdy <- bdy[length(bdy)-1] 
    data_frame(target = trimws(bdy), params = params) 
    }) %>% 
    mutate(fname = ls(fenv)) 

생산 : 당신이 뭔가를 할 수

funA <- function(x, y){ 
    y <- x + 2 
    y 

} 

funB <- function(y){ 
    z <- y^2 
    z 

} 

test.r 이름 :

+2

'lsf.str()'을 사용하여 함수를 가리키는 모든 변수를 나열 할 수 있습니다 . – MrFlick

+0

'lsf.str()'팁, @MrFlick을 주셔서 감사합니다. – ropolo

+0

@Stefan F : 수동으로 함수 본문을 구문 분석하는 것이 왜 나쁜 생각입니까? – ropolo

2

이 같은 소스 파일이 가정 깨지기 쉬운의

## # A tibble: 2 x 3 
## target params fname 
## <chr> <list> <chr> 
## 1  y <chr [2]> funA 
## 2  z <chr [1]> funB 

하지만, 아니요 깨지기 쉬운 필터이므로 평가 및 임시 환경 할당 전에 언어 객체 및 함수를 내보내십시오.

params 열에서 매개 변수 이름을 추출하여 궁극적으로 필요한 것을 생성 할 수 있다고 가정합니다.

+0

감사합니다, @hrbrmstr. 나는 이것을 시도 할 것이다. – ropolo