在此先感谢和抱歉,如果这个问题前面已经回答了 - 我已经非常广泛期待。 我有一个包含与级联信息,特别是一个行的数据集:名称,颜色代码,一些函数表达式。 例如,一个值可以为:
成本#FF0033 @日志(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错误(表达式,ENVIR,enclos):对象“X”未找到
最终的目标是把功能列表,并应用第j功能于data.frame的第j列,以便脚本的用户可以指定如何列标题所给出的级联信息中正常化的每一列。
也许有一个泛型函数初始化列表,然后利用更新它们:
foo <- function(x){x+3}
> body(foo) <- quote(x+4)
> foo
function (x)
x + 4
更具体地讲,从一个字符开始,你可能会做这样的事情:
body(foo) <- parse(text = "x+5")
我想补充到joran的答案,这是最后的工作:
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))
再次感谢,joran。
这是我做的:
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)