2012-09-03 46 views
6

関数を書く方法を知っている人はいませんか?Fは、関数呼び出し(たとえばmean(x = 1:10))を引数としてとり、機能は呼び出された(平均)か?関数呼び出しから関数呼び出し名を抽出する

デ・解析は非常に助けていないようです前に私の最高の試みは、これまで

式にX1(関数呼び出し)を変更
(function(x1){ 

    return(deparse(substitute(x1))) 

})(mean(x = 1:10)) 
### 'mean(x = 1:10)' 

以下に要約されています

(function(x1){ 

    return(deparse(as.expression(substitute(x1)))) 

})(mean(x = 1:10)) 
# "expression(mean(x = 1:10))" 

を返します可能であれば、匿名関数を引数として使用できるようにしたいので、Fは、(function(x)print(x))(1)に対して(function(x)print(x) )。説明が必要な場合は、自由にコメントしてください。ありがとう。

edit1:私は最初のかっこをチェックして、その前にコードを切り捨てることは避けたいと思います( "平均(x = 1:10)"の場合は "平均"を返します)ジョシュ・オブライエンの答えは完璧だった:

F <- function(x) deparse(substitute(x)[[1]]) 

は、それが動作され、上記の条件を満たした機能F悪い(Fun_nAmeは」実際に

質問の回答R.における法的な関数名ですバイナリ演算子、標準関数、および匿名関数に対してうまくいきます。

答えて

8

ここでは、単純な機能ですあなたが望むことをやります:

F <- function(x) deparse(substitute(x)[[1]]) 

F(mean(x=1:10)) 
# [1] "mean" 

F((function(x) print (x))(1)) 
# [1] "(function(x) print(x))" 

F(9+7) 
# [1] "+" 
1

私はあなたが何をしようとしているのか分からないか、それは良いアイデアだ場合は、これはあなたが望むものであるが、ここで正規表現とそれに強打だ場合:

FUN <- function(x1){ 
    z <- deparse(substitute(x1)) 
    list(fun=strsplit(z, "\\(")[[c(1, 1)]], 
    eval=x1) 
} 

FUN(mean(x = 1:10)) 
関連する問題