R - 对列表中的函数的过程调用

时间:2014-01-04 12:18:36

标签: r list function

我在创建对作为列表元素的函数的过程调用时遇到了麻烦。

我有一个类型

的函数列表
> initial
$g452
function (v) 
.approxfun(x, y, v, method, yleft, yright, f)
<bytecode: 0x06bd04e8>
<environment: 0x06c7a4c8>

$g664
function (v) 
.approxfun(x, y, v, method, yleft, yright, f)
<bytecode: 0x06bd04e8>
<environment: 0x06c7a5a8>

$g1431
function (v) 
.approxfun(x, y, v, method, yleft, yright, f)
<bytecode: 0x06bd04e8>
<environment: 0x06be62d4>
...

我需要在程序上为每个函数创建一个call

我试过

g<-"g452"
eval(call(paste('initial[["',g,'"]]', sep=""), quote(t)))
Error in eval(expr, envir, enclos) : 
  could not find function "initial[["g452"]]"

a[[1]] <- paste("initial[['",g,"']]", sep="")
a[[2]] <- quote(t)
eval(as.call(a))
Error in eval(expr, envir, enclos) : 
  attempt to apply a non-function

我该怎么做?

注意:我只需要在单独的时间内call创建eval

2 个答案:

答案 0 :(得分:1)

您可以尝试使用mapply

> funs <- list(fn1 = function(x,y) x + y, fn2 = function(x,y) x * y, fn3 = function(x,y) x ** y)
> mapply(do.call, funs, list(list(1,2)))
fn1 fn2 fn3 
  3   2   1 
>

mapplydo.call应用于列表中的每个函数,并将第二个列表的相应元素作为参数。第二个列表是包含一个元素的列表(因此被回收),它本身是一个映射到xy的两个参数的列表。

或者,正如@Jake建议的那样,您可以使用lapply

> lapply(funs, function(f) f(1,2))
$fn1
[1] 3

$fn2
[1] 2

$fn3
[1] 1

应用匿名函数function(f) f(1,2),该函数将函数作为输入,并将函数的求值与参数1和2一起输出到函数列表的每个元素。

完全的方法是创建要在稍后阶段进行评估的函数:

> create.fun <- function(index, arg1, arg2) { return (function() funs[[index]](arg1, arg2))}
> create.fun("fn1",1,2)->f1
> create.fun("fn2",1,2)->f2
> f1
function() funs[[index]](arg1, arg2)
<environment: 0x102d12978>
> f2
function() funs[[index]](arg1, arg2)
<environment: 0x102d12e30>

然后,稍后,

> f1()
[1] 3
> f2()
[1] 2
> 

答案 1 :(得分:0)

R> initial <- list(g425 = function(v) rnorm(v, mean = 10), g664 = function(v) rnorm(v))
R> initial
## $g425
## function (v)
## rnorm(v, mean = 10)
##
## $g664
## function (v)
## rnorm(v)

R> initial[["g425"]](1)
## [1] 9.963475
R> initial[["g664"]](10)
## [1] -0.195207690 -0.005614015 -1.588652593 -0.667482330 -0.386502730
## [6]  1.602831100 -0.044661135  0.522090969 -0.411569136  0.567418372
R> lapply(initial, function(f) f(5))
## $g425
## [1]  8.961135 10.982837  9.314733  9.850552 10.752787
##
## $g664
## [1] -0.3052389 -0.5199387  1.7668233  0.3558805  0.9558824
R> f <- initial[["g425"]]
R> foo <- call("f", 3)
R> eval(foo)

## [1]  8.890765 11.708142  9.368686