任意の正当な R 式で使用されているすべての関数の名前を見つけようとしていますが、以下の例を名前ではなく関数としてフラグ付けする関数が見つかりません。
test <- expression(
this_is_a_function <- function(var1, var2){
this_is_a_function(var1-1, var2)
})
all.vars(test, functions = FALSE)
[1] "this_is_a_function" "var1" "var2"
all.vars(expr, functions = FALSE) は、式で関数宣言 (f <- function(){}) を返し、関数呼び出し ('+'(1,2), ...) を除外しているようです。
名前ではなく関数として 'this_is_a_function' にフラグを立てる関数 (コア ライブラリまたは他の場所) はありますか? 構文的には正しいが、正しく評価されない可能性がある任意の式で動作する必要がある (例: '+'(1, 'duck'))
同様の質問を見つけましたが、解決策が含まれていないようです。
明確化が必要な場合は、下にコメントを残してください。パーサー パッケージを使用して式を解析しています。
編集:@ハドリー
スクリプト全体を含む式があります。これは通常、ネストされた関数定義を含むメイン関数で構成され、スクリプトの最後にメイン関数が呼び出されます。
関数はすべて式の中で定義されており、'<-' と '{' を含める必要があるかどうかは気にしません。これらは自分で簡単に除外できるからです。
動機は、すべての R スクリプトを取得し、関数の使用が時間の経過とともにどのように変化したかについての基本的な統計を収集することです。
編集:現在のソリューション
正規表現ベースのアプローチは、関数定義を取得し、James のコメントのメソッドと組み合わせて関数呼び出しを取得します。私は右側の割り当てを使用しないため、通常は機能します。
function_usage <- function(code_string){
# takes a script, extracts function definitions
require(stringr)
code_string <- str_replace(code_string, 'expression\\(', '')
equal_assign <- '.+[ \n]+<-[ \n]+function'
arrow_assign <- '.+[ \n]+=[ \n]+function'
function_names <- sapply(
strsplit(
str_match(code_string, equal_assign), split = '[ \n]+<-'),
function(x) x[1])
function_names <- c(function_names, sapply(
strsplit(
str_match(code_string, arrow_assign), split = '[ \n]+='),
function(x) x[1]))
return(table(function_names))
}