假设我在R中有一个带有多个参数的函数,并且我希望通过将一些参数设置为预先指定的值来将其减少为参数较少的函数。我试图找出最好的方法是在R。
例如,假设我有一个功能
f <- function(a,b,c,d){a+b+c+d}
我想创建或找到一个可执行以下操作的部分
partial <- function(f, ...){
#fill in code here
}
new_f <- partial(f, a=1, c= 2)
new_f
将是b
和d
的函数,并会返回1+b+2+d
在python中我会做
from functools import partial
def f(a,b,c,d):
return a+b+c+d
new_f = partial(f, a=1, c= 2)
我实际上反复这样做,所以我需要尽可能高效。谁能指出我最有效的方法呢?现在我能做的最好的就是
partial <- function(f, ...){
z <- list(...)
formals(f) [names(z)] <- z
f
}
任何人都可以告诉我更快的方法或最好的方法吗?这太慢了。
答案 0 :(得分:23)
使用do.call
:
partial <- function(f, ...) {
l <- list(...)
function(...) {
do.call(f, c(l, list(...)))
}
}
基本上partial
返回一个存储f
的函数以及最初提供的参数(存储在列表l
中)。调用此函数时,它会传递l
中的参数和任何其他参数。这是在行动:
f <- function(a, b, c, d) a+b+c+d
p <- partial(f, a=2, c=3)
p(b=0, d=1)
# [1] 6
答案 1 :(得分:18)
pryr
包中有一些可以处理此问题的函数,即partial()
f <- function(a, b, c, d) a + b + c + d
pryr::partial(f, a = 1, c = 2)
# function (...)
# f(a = 1, c = 2, ...)
所以你可以像这样使用它 -
new_fun <- pryr::partial(f, a = 1, c = 2)
new_fun(b = 2, d = 5)
# [1] 10
## or if you are daring ...
new_fun(2, 5)
# [1] 10
您也可以使用
简单地更改f()
的正式参数
f <- function(a, b, c, d) a + b + c + d
formals(f)[c("a", "c")] <- list(1, 2)
f
# function (a = 1, b, c = 2, d)
# a + b + c + d
f(b = 2, d = 5)
# [1] 10
但是对于后者,您必须为b
中的d
和f()
个参数命名,以避免在您想要离开{{1}时出错}和a
作为默认值。
答案 2 :(得分:9)
您还可以使用Curry
包中的functional
:
library(functional)
f <- function(a, b, c, d) a+b+c+d
ff = Curry(f, a=2, c=10)
ff(1,5)
#[1] 18
ff(b=1,d=5)
#[1] 18