将向量解包为函数参数

时间:2017-03-03 10:40:55

标签: r functional-programming higher-order-functions

我有一个带有四个参数的函数,例如

fun <- function( x, a, b, c ) {
    sin( x * a ) * exp( -x * b ) + x * c
}

我希望将其转换为一个函数,其中三个参数作为向量提供,修复第一个(在此示例中为df$X)。以下显然有效:

fx <- function( args ) {
    fun( df$X, args[ 1 ], args[ 2 ], args[ 3 ] )
}

如何将此过程包装到函数中以获取任意数量的尾随函数参数,并返回上面的函数fx?伪代码:

fixVector <- function( f, vec ) {
    function( args ) {
        f( vec, magic_unpack( args ) )
    }
}
fx <- fixVector( fun, df$X )

fx <- fixVector( fun, 1:10 )
fx( 1:3 )
# [1]  3.113881  6.016654  9.000350 11.999746 14.999956 17.999998 21.000001 24.000000 27.000000 30.000000

magic_unpack()

的合适定义是什么?

2 个答案:

答案 0 :(得分:2)

我使用do.call

x <- 1:10
a <- 1:3

fun <- function( x, a, b, c ) {
  sin( x * a ) * exp( -x * b ) + x * c
}

fixVector <- function( f, vec, args) {
  do.call(f, c(list(vec), as.list(args)))
}

fixVector(fun, x, a)
#[1]  3.113881  6.016654  9.000350 11.999746 14.999956 17.999998 21.000001 24.000000 27.000000 30.000000

答案 1 :(得分:0)

在Roland的提示基础上,fixVector的可能实现是

fixVector <- function( f, vec ) {
    function( args ) {
        do.call( f, c( list( vec ), as.list( args ) ) )
    }
}

用法示例:

fun <- function( x, a, b, c ) {
  sin( x * a ) * exp( -x * b ) + x * c
}

fx <- fixVector( fun, 1:10 )
fx( 1:3 )
# [1]  3.113881  6.016654  9.000350 11.999746 14.999956 17.999998 21.000001
# [8] 24.000000 27.000000 30.000000