2017-11-08 5 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を作成するにはどうしたらいいですか?

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

一つは、このように手でこれを行うだろう:

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

し、次いで、ワークフローを実行します。

drake::make(my_plan) 

ありがとうございました。

+1

生のスクリプトテキストファイルを実行せずに解析したいですか?または、これらのオブジェクトがアクティブなRセッションにロードされていますか? – MrFlick

+0

@MrFlick: 'source(" functions.R ")'のようなことをして、アクティブなRセッションにロードしているオブジェクトを解析したいと思います。 – ropolo

+1

特定のファイルのソースコード分析を本当に行いたい場合は、 'parse(" functions.R ")'を調べることができます。私はまだあなたがしようとしていることはちょっと意地悪なものだと思っていますが、実際のヒントを与えるためにdrakeについて十分に分かっていません。/ –

答えて

2

あなたはまた、関数の名前を取得する方法はありませんbody()environment()

と関数の本体と環境を抽出することができますformals()

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

で引数を取得することができます。関数に実際に名前がない場合、名前は関数を参照しています(名前がわからない場合は、どのような参照が必要なのでしょうか?)。

戻り値を取得する方法もありません。あなたの例では、手動での機能のbody()を解析することによってzyを得ることができるが、これは本当に悪い考えであり、あなたが特定の方法で、あなたの関数のソースを記述する場合にのみ動作します。あなたがこれをしたとしても、それは意味をなさない。 zおよびyは、関数が復帰すると破棄されます。あなたが戻り値と関数namenを必要とする理由を正確に

たぶん、あなたは私はあなたが達成しようとしているものを周りに他の方法があると確信している、手の込んだことができます。

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 

が、いいえtoo脆弱なのでフィルターです評価と一時的な環境割り当ての前に言語オブジェクトと関数を出力する。

私は、paramsカラムからパラメータ名を抽出し、必要なものを最終的に生成することを前提にしています。

+0

ありがとう、@hrbrmstr。私はこれを試してみましょう。 – ropolo