Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将参数传递给Compose';d函数?_R_Functional Programming - Fatal编程技术网

R 将参数传递给Compose';d函数?

R 将参数传递给Compose';d函数?,r,functional-programming,R,Functional Programming,在这种情况下,我希望将参数传递给通过Compose链接的函数。我意识到我可以插入参数,但我希望得到的函数更灵活。下面是一个简单的测试用例来说明问题: > 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 : 'sc

在这种情况下,我希望将参数传递给通过
Compose
链接的函数。我意识到我可以插入参数,但我希望得到的函数更灵活。下面是一个简单的测试用例来说明问题:

> 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)
>库(功能性)
>f g h(1)
x^2*刻度中出错:缺少“刻度”
>h(1,刻度=1,移位=0)
Reduce(函数(x,f)f(x),fs,…)中的错误:
未使用的参数(比例=1,移位=0)
是否有任何方法可以使用
Compose
,使结果函数在被调用时仍然允许参数<代码>?编写没有什么帮助,也许只是作为一个可爱键盘的挽歌。

正如计算机科学中所阐述的,所有函数只有一个参数。
Composition
函数也假设了这一点<代码>咖喱ing是解决这一问题的典型方法。另一个复杂的问题是,任何附加的命名参数都必须在组合过程中传递给正确的函数

以下是几种方法:

h1 <- function(scale, shift)
  Compose(Curry(f,scale), Curry(g,shift))
另一种方法是将电流(以及合成)延迟到实际功能评估。在本例中,原始的“Compose”函数只是设置了所有内容,但实际上并没有进行组合,返回一个curries、Compose和evaluation函数

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)

你是从哪个包裹里得到的?安德烈-哈什@Dason这是(现在,感谢Josh的编辑)我代码中的第一行:-)。对不起,忘了复制/粘贴那一行。
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(1, scale=1, shift=0)
[1] 1
> h2(3, scale=5, shift=2)
[1] 8.708204
> sqrt(5*(3^2))+2
[1] 8.708204