7

事前に感謝します。この質問が以前に回答されている場合は申し訳ありません-私はかなり広範囲に調べました。具体的には、名前、色コード、関数式など、連結された情報の行を含むデータセットがあります。たとえば、1 つの値は次のようになります。

cost#FF0033@log(x)+6.

情報を抽出するためのすべてのコードがあり、実際の関数のリストに変換したい式のベクトルが得られます。

例えば:

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

ここで、test.func は式のベクトルです。私が欲しいのは:

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 列に適用することです。これにより、スクリプトのユーザーは、列ヘッダーによって提供される連結された情報内の各列を正規化する方法を指定できます。

4

3 に答える 3

4

おそらく、単一の汎用関数でリストを初期化し、次を使用して更新します。

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

より具体的には、キャラクターから始めて、おそらく次のようにします。

body(foo) <- parse(text = "x+5")
于 2012-08-24T22:19:19.327 に答える
2

これが私がすることです:

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)
于 2014-08-20T02:23:54.283 に答える
2

ジョランの答えに追加するだけで、これが最終的に機能しました:

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))

ありがとう、ジョラン。

于 2012-08-27T14:34:55.070 に答える