在函数内部存储函数参数并将其应用于将来在r中使用

时间:2014-12-28 03:17:31

标签: r function

我的功能相当复杂,但以下是我想要做的简化版本。

假设我将以下函数设置为返回列表,我希望将传递给函数的参数存储为元素之一。

myfun <- function (a, x, y, z, ...){
         out <- a+x+y+z
         arg <- list(x=x,y=y, z=z,...)
         outlist <- list(out=out, arg=arg)
         return(outlist)
         }

这里我将参数存储在函数列表中。存储参数的目的是我可以在其他函数中完全相同地应用它们而无需再次编写它们。只需使用返回的输出数据对象,我们就可以运行函数可重现的方式。

我想说我只想改变a,但其他功能的应用也是如此。

xy <- myfun(a=4,x=5,y=6,z=9,k=10)
myfun(a=10, xy$arg)
Error in a + x : non-numeric argument to binary operator
myfun(a=6, xy$arg)

我该怎么做?

编辑:

一些澄清:

myfun参数是动态的 - 意味着可以采用不同的参数 - 例如上例中的K.可以是下一次:

xy <- myfun(a=4,x=5,y=6,z=9,k=10, l=13)

我的想法是将一次运行中传递的所有参数存储为列表(arg$outlist),并且列表可以在不同时间具有不同的元素。

2 个答案:

答案 0 :(得分:6)

您希望 Curry 您的功能:

> myfun <- function (a, x, y, z, ...) a+x+y+z
> library(functional)
> myfun2 <- Curry(myfun, x=5,y=6,z=9,k=10)
> myfun2(4)
[1] 24         # == 5 + 6 + 9 + 10 + 4
> myfun2(10)
[1] 30         # == 5 + 6 + 9 + 10 + 10
> myfun2(6)
[1] 26         # == 5 + 6 + 9 + 10 + 6

Curry创建一个预先设置了所有指定参数的新函数。然后,您可以使用该新功能。

答案 1 :(得分:3)

这种方法也可能适合您的需求:

hijack <- function (FUN, ...) {
    .FUN <- FUN
    args <- list(...)
    invisible(lapply(seq_along(args), function(i) {
        formals(.FUN)[[names(args)[i]]] <<- args[[i]]
    }))
    .FUN
}


myfun <- function (a, x, y, z, ...) sum(..., a, x, y, z)

myfun2 <- hijack(myfun, a=4,x=5,y=6,z=9)

myfun2(4)
myfun2(10)

## > myfun2(4)
## [1] 24
## > myfun2(10)
## [1] 30
## > myfun2(6)
## [1] 26