2012-08-24 20 views
5

前もってありがとうございました。そして、この質問が以前に答えられたのであれば申し訳ありません - 私はかなり広く見えました。私は、連結された情報の行を含むデータセットを持っています。具体的には、名前、カラーコード、関数式などです。例えば、1つの値は、文字のベクトルから関数のリストを作成

コスト#FF0033 @ log(x)+6であってもよい。

私は情報を抽出するためのコードをすべて持っており、実際の関数のリストに変換したい式のベクトルになります。例えば

:test.funcは式のベクトルである

func.list <- list() 
test.func <- c("x","x+1","x+2","x+3","x+4") 

。私が希望することです:

func.list[[3]] 

は私が使用して関数を作成することができることを知って

function(x){x+3} 

に相当すると:

somefunc <- function(x){eval(parse(text="x+1"))} 

は、関数に文字値を変換します。問題は、私が複数の機能を作るために試してループするときに起こります。

for(i in 1:length(test.func)){ 
    temp <- test.func[i] 
    f <- assign(function(x){eval(expr=parse(text=temp))}) 
    func.list[[i]] <- f 
} 

別のポストに基づいて(http://stats.stackexchange.com/questions/3836/how-to-create-a-vector-of:動作しませんでした私が試した何かの例-functions)また、私はこれを試してみました:次のエラーを与える

makefunc <- function(y){y;function(x){y}} 
for(i in 1:length(test.func)){ 
    func.list[[i]] <- assign(x=paste("f",i,sep=""),value=makefunc(eval(parse(text=test.func[i])))) 
} 

:エラーをevalの中で(式expr、ENVIR、enclos):オブジェクトが

最終的な目標は、リストを取ることです

が見つかりません 'X' j番目の関数をdata.frameのj番目のカラムに適用することで、スクリプトのユーザは各カラムを正規化する方法を指定することができます列ヘッダによって与えられた連結情報内の列。

答えて

3

たぶん、単一の汎用機能であなたのリストを初期化した後、使用してそれらを更新します。

body(foo) <- parse(text = "x+5") 
+0

感謝!!それは完璧に働いた。私は、私がそうすることができるようになると、私は他のユーザーのための追加の答えとして私がタスクを完了するために使用したコードを追加します。 (そして、すべてのコメント/編集/削除/その他のことについて申し訳ありません - 私はSOにはっきりと新しくなっています) – dayne

+0

@dayne私はあなたに、まったく問題の手を頂いたと思います。 – joran

2

foo <- function(x){x+3} 
> body(foo) <- quote(x+4) 
> foo 
function (x) 
x + 4 

具体的には、文字から始まる、あなたはおそらくのような何かをしたいですジョランの答えに追加するだけで、これは最終的にうまくいきました。

test.data <- matrix(data=rep(1,25),5,5) 
test.data <- data.frame(test.data) 

test.func <- c("x","x+1","x+2","x+3","x+4") 
func.list <- list() 

for(i in 1:length(test.func)){ 
    func.list[[i]] <- function(x){} 
    body(func.list[[i]]) <- parse(text=test.func[i]) 
} 

processed <- mapply(do.call,func.list,lapply(test.data,list)) 

ありがとうございました、ジョラン。

1

これは私が何をすべきかです:

f <- list(identity="x",plus1 = "x+1", square= "x^2") 
funCreator <- function(snippet){ 
    txt <- snippet 
    function(x){ 
    exprs <- parse(text = txt) 
    eval(exprs) 
    } 
} 
listOfFunctions <- lapply(setNames(f,names(f)),function(x){funCreator(x)}) # I like to have some control of the names of the functions 
listOfFunctions[[1]] # try to see what the actual function looks like? 
library(pryr) 
unenclose(listOfFunctions[[3]]) # good way to see the actual function http://adv-r.had.co.nz/Functional-programming.html 
# Call your funcions 
listOfFunctions[[2]](3) # 3+1 = 4 
do.call(listOfFunctions[[3]],list(3)) # 3^2 = 9 
attach(listOfFunctions) # you can also attach your list of functions and call them by name 
square(3) # 3^2 = 9 
identity(7) # 7 ## masked object identity, better detach it now! 
detach(listOfFunctions) 
関連する問題