gpt4 book ai didi

r - 将参数传递给 Compose 的函数?

转载 作者:行者123 更新时间:2023-12-04 18:47:28 24 4
gpt4 key购买 nike

我有一种情况,我想将参数传递给通过 Compose 链接的函数.我意识到我可以在参数中使用 Curry,但我希望生成的函数比这更灵活。这是一个显示问题的简单测试用例:

> library(functional)
> f <- function(x, scale) x^2*scale
> g <- function(y, shift) sqrt(y)+shift
> h <- Compose(f,g)
> h(1)
Error in x^2 * scale : 'scale' is missing
> h(1, scale=1, shift=0)
Error in Reduce(function(x, f) f(x), fs, ...) :
unused argument(s) (scale = 1, shift = 0)

有什么方法可以使用 Compose这样它允许结果函数在被调用时仍然允许参数吗? ?Compose没有什么帮助,除了作为可爱键盘的挽歌。

最佳答案

function composition是在计算机科学中制定的,所有函数只有一个参数。 Composition函数也假设了这一点。 Curry ing 是解决此问题的典型方法。另一个复杂之处在于,任何附加的命名参数都必须在组合过程中传递给正确的函数。

这里有几种方法:

h1 <- function(scale, shift)
Compose(Curry(f,scale), Curry(g,shift))
h1采用命名参数并使用正确的柯里化(Currying)创建组合函数。返回是一个 1 参数函数:
> h1(scale=1, shift=0)(1)
[1] 1

另一种方法是将柯里化(Currying)(以及组合)延迟到实际的函数评估。在这种情况下,原始的“Compose”函数只是设置了所有内容,但实际上并没有进行组合,而是返回一个可进行柯里化(Currying)、组合和评估的函数。
ComposeDelayedCurry <- function(...) {
fs <- list(...)
all.formals <- lapply(fs, formals)
function(...) {
local.args <- list(...)
pos.args <- lapply(all.formals, function(f) {
local.args[names(f)[[-1]]]
})
curried <- lapply(seq_along(fs), function(i) {
do.call(Curry, c(fs[[i]], pos.args[[i]]))
})
do.call(Compose, curried)(..1)
}
}

h2 <- ComposeDelayedCurry(f,g)

现在调用 h2将在评估时完成所有工作。这做了几个假设。一个是每个函数(和函数调用)的第一个参数是被组合的那个。第二个是所有其他参数都是命名参数。没有任何东西可以通过 ... 传递给函数.这是因为必须检查每个函数的形式,以了解每个参数“去”到哪里。我认为这将处理不使用默认值指定参数,但我不完全确定。
> h2(1, scale=1, shift=0)
[1] 1
> h2(3, scale=5, shift=2)
[1] 8.708204
> sqrt(5*(3^2))+2
[1] 8.708204

关于r - 将参数传递给 Compose 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11829633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com