如何通过R中的位置来讨论...论证?

时间:2012-06-27 18:10:42

标签: r currying

这可能属于“你不能,也没有理由”,但我很好奇是否有可能。至少,也许这将是一个有趣的R拼图。

我正在考虑让cat总是追加\n。但是,cat被写入,以便它将所给的参数粘贴在一起(通过...)。

令人惊讶的是,这有效:

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

 hi

然而,\n在用户的文本之前结束。有没有办法解决这个函数,你指定curried参数总是结束...参数?

2 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:7)

<强>#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")

请注意,每个测试都应该生成一行代表,然后以换行符结束。

编辑:更多解决方案。