2016-04-29 13 views
-1

私は関数のリストを引数として取る関数を持っています。オブジェクトのリストから、その名前の文字ベクトルを取得

library(moments) 
library(plyr) 
tests <- list(mean, varience, skewness, kurtosis) 
f <- function(X, tests){ 
    out <- each(... = tests)(X) #each from plyr 
    names(out) <- GetNames(tests) 
    out 
} 

私はGetNamesが、この場合、関数で、オブジェクトのリストを取り、テキストなどのオブジェクトの名前を返すようにしたいです。理想的には、私は名前付きオブジェクトの任意のリストで動作するようにGetNamesが欲しい:

> GetNames(tests) 
[1] "mean"  "varience" "skewness" "kurtosis" 

as.character(tests)は、自分の名前を、各関数のコードのテキストを返しません。

私が試した:

GN <- function(X) deparse(substitute(X)) 
GetNames <- function(X) lapply(tests, GN) 
GetNames(tests) 

をしかし、これは返します

[[1]] 
[1] "X[[i]]" 

[[2]] 
[1] "X[[i]]" 

[[3]] 
[1] "X[[i]]" 

[[4]] 
[1] "X[[i]]" 

Rコードを書くとき、私は頻繁にこの問題のいくつかのバージョンがあります。私は関数の引数をいくつかのステップを評価する、ここでは1つのステップtestsからそのオブジェクトの名前にして停止して、結果に何かをさせてください、ここでは文字列に変換するのではなく、私は彼ら(名前)をつかむことができる前に、名前の指示対象。

+0

問題の一般的なバージョンを理解できないのですが、これが多くなると、これらのタスクを実行するためのより良い方法があるかもしれません。 – MrFlick

+0

お寄せいただきありがとうございます。 – andrewH

答えて

5

あなたは

tests <- list(mean, varience, skewness, kurtosis) 

を実行すると、これらのシンボルが評価され、廃棄されています。あなたは

tests[[2]] 

か何かを見れば、あなたは本当にvarienceに元の参照ではなく、シンボルvarienceは今リストに保存されているために指摘していることfuncionではありませんがわかります。 (約束事とコールスタックのおかげで、関数にパラメータを渡すときには少し違って動作しますが、ここでやっていることとは異なります)。実行した後にlist()の遅延評価はありません。

機能の名前を保持したい場合は、おそらく名前付きリストを使用するのが最善です。あなたは今、値が私はあなたの避難所は、情報のいくつかの作品にあると思います名前

names(tests) 
# [1] "mean"  "var"  "skewness" "kurtosis" 
+0

ありがとう!これは、関数の名前を持つオブジェクトに適用される関数のリストの出力に、すべてを2回入力することなく名前を付けることです。 – andrewH

+0

ねえ、それはnlist()がfunction_の中で定義されている場合でも動作します。優れた! – andrewH

1

私はこの質問に困惑ビットであることに告白し、として保存されている

nlist <- function(...) { dots<-substitute(...()); setNames(list(...), sapply(dots, deparse))} 
tests <- nlist(mean, var, skewness, kurtosis) 

のようなヘルパー関数を作ることができます私たちと共有していません。例えば

、あなたが言う:

私はによりgetNamesはあの名前付きオブジェクトの任意のリストを

仕事したいのですが...よくオブジェクトのリストの名前ため、このよう関数が既に存在し、それはnames()と呼ばれています。

tests <- list("mean" = mean, "variance" = variance, 
       "skewness" = skewness, "kurtosis" = kurtosis) 

か、setNamesを経由して、プログラム名を設定することができます。

この種のものを行うには、「まとも」な方法は、ちょうど最初の場所で、リストに名前を付けています。

+1

名前付きリストを言うと、私は名前付きオブジェクトのリストを言った。私の例のオブジェクトは関数です。関数には名前があります。名前(テスト)はNULLを返します。 lapply(tests、names)は5つのNULLのリストを返します。頻繁に使用される関数にすべてを2回入力したくないのは不思議ですか? – andrewH

関連する問題