【问题标题】:How to curry a ... argument by position in R?如何在 R 中按位置咖喱...参数?
【发布时间】:2012-06-27 18:10:42
【问题描述】:

这可能属于“你不能,而且无论如何也没有理由”,但我很好奇它是否可能。至少,也许这会是一个有趣的 R 谜题。

我正在考虑使用柯里化 cat 以始终附加 \n。但是,cat 的编写方式是,它可以将给出的参数粘贴到一起(通过...)。

令人惊讶的是,这有效:

> library(functional)
> catnip <- Curry( cat, "\n" )
> catnip("hi")

 hi

但是,\n 在用户的文本之前结束。有什么方法可以对函数进行 curry,以便您指定 curried 参数始终以 ... 参数结尾?

【问题讨论】:

  • 漂亮回答了所有问题。我对do.call 的掌握还不完整,但在进步。谢谢:-)

标签: r currying


【解决方案1】:

看起来Curry() 非常有效地以与您想要的相反顺序硬连线两个参数列表。不过,这是一个足够简单的函数,您可以构建它的镜像,然后使用它。

Curry2 <- function(FUN, ...) {
    .orig = list(...)
    function(...) do.call(FUN, c(list(...), .orig))
}

catnip <- Curry2( cat, "\n" )
catnip("hi")

【讨论】:

    【解决方案2】:

    #1。忽略 Curry 的第二个参数并硬编码换行符

    试试这个,它将cat 的最后一个参数硬编码在一个匿名函数中。它实际上并没有在第一个参数之后使用 Curry 参数:

    catnip <- Curry(function(...) cat(..., "\n") )
    

    #2。通过柯里化匿名函数来制造函数

    这是第二种解决方案,它使用匿名函数对cat 的参数进行重新排序,从而将cat 的最后一个参数集中起来。

    catnip2 <- Curry(function(last.arg, ...) cat(..., last.arg), "\n")
    
    # test
    catnip2("hi", "there")
    

    #3。通过对更基本的函数进行柯里化来制造所需的函数

    也许这一切的真正意义在于看看我们如何获取基本组件并将它们库里化以获得我们想要的东西。因此我们可以定义一个通用的last.arg.fun,然后通过对它的咖喱来制造所需的功能:

    last.arg.fun <- function(FUN, last.arg, ...) FUN(..., last.arg)
    catnip3 <- Curry(last.arg.fun, cat, "\n")
    
    # test
    last.arg.fun(cat, "\n", "hi", "there")
    
    # test
    catnip3("hi", "there")
    

    如果我们在某个时候需要last.arg.cat,我们可以分两步完成:

    last.arg.cat <- Curry(last.arg.fun, cat)
    catnip4 <- Curry(last.arg.cat, "\n")
    
    # test
    last.arg.cat("\n", "hi", "there")
    
    # test
    catnip4("hi", "there")
    

    请注意,每个测试都应该产生一行,说 hi there 以换行符结尾。

    编辑:更多解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2021-07-29
      相关资源
      最近更新 更多