我在创建对作为列表元素的函数的过程调用时遇到了麻烦。
我有一个类型
的函数列表> 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
答案 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
>
mapply
将do.call
应用于列表中的每个函数,并将第二个列表的相应元素作为参数。第二个列表是包含一个元素的列表(因此被回收),它本身是一个映射到x
和y
的两个参数的列表。
或者,正如@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