我有一个带有四个参数的函数,例如
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()
答案 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