5

这不是一个真正的问题,但我想知道是否有更优雅的解决方案:

假设我有一个向量vec <- rlnorm(10),我想对它应用一个未向量化的函数,例如exp(暂时忽略它是向量化的),我可以做

sapply( vec, exp )

但是当我要应用的函数是嵌套的时候,表达式就直接变得不那么简单了:

sapply( vec, function(x) exp( sqrt(x) ) )

这种情况一直发生在我applyplyr家人身上。

所以我的问题是,通常是否有一种优雅的方式来嵌套(或管道)函数而不明确定义(匿名)函数function(x){...}?就像是

# notrun
sapply( vec, sqrt | exp )

或类似的。

4

2 回答 2

6

请参阅以下示例?Reduce

## Iterative function application:
Funcall <- function(f, ...) f(...)
## Compute log(exp(acos(cos(0))
Reduce(Funcall, list(log, exp, acos, cos), 0, right = TRUE)

这是一个更简单的实现,接口略有不同:

Compose <- function(x, ...)
{
    lst <- list(...)
    for(i in rev(seq_along(lst)))
        x <- lst[[i]](x)
    x
}

sapply(0, Compose, log, exp, acos, cos)
于 2013-06-19T12:08:14.593 回答
5

函数包括一个Compose函数。

library(functional)
id <- Compose(exp, log)
id(2) # 2

它的实现很简单,可以包含在您的源代码中,例如,如果您不需要功能包中的其余内容。

R> Compose
function (...) 
{
    fs <- list(...)
    if (!all(sapply(fs, is.function))) 
        stop("Argument is not a function")
    function(...) Reduce(function(x, f) f(x), fs, ...)
}
<environment: namespace:functional>
于 2013-06-19T12:22:11.743 回答