当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R funprog 函数式编程语言中常见的高阶函数


R语言 funprog 位于 base 包(package)。

说明

Reduce

使用二元函数连续组合给定向量的元素和可能给定的初始值。

Filter

提取谓词(逻辑)函数给出 true 的向量元素。

FindPosition

分别给出第一个或最后一个这样的元素及其在向量中的位置。

Map

将函数应用于给定向量的相应元素。

Negate

创建给定函数的否定。

用法

Reduce(f, x, init, right = FALSE, accumulate = FALSE, simplify = TRUE)
Filter(f, x)
Find(f, x, right = FALSE, nomatch = NULL)
Map(f, ...)
Negate(f)
Position(f, x, right = FALSE, nomatch = NA_integer_)

参数

f

适当数量的函数(二进制为 Reduce ,一元为 FilterFindPosition -ary 为 Map 如果使用 参数调用)。 Negate 的任意谓词函数。

x

一个向量。

init

一个R与元素相同类型的对象x.

right

指示是从左到右(默认)还是从右到左进行的逻辑。

accumulate

指示是否应累积连续归约组合的逻辑。默认情况下,仅使用最终组合。

simplify

一个逻辑,指示累积结果是否应该被简化(通过取消列出),以防它们都是长度一。

nomatch

找到“no match”(没有满足谓词的元素)时返回的值。

...

该函数是 Map() ped 的向量,以及传递给它的 mapply 的其他参数,例如 MoreArgs

细节

如果init给出,Reduce逻辑上将其添加到开始(从左到右进行时)或结束x, 分别。如果这可能是增广向量 元素,Reduce陆续申请 的元素 分别从左到右或从右到左。即,左减少计算 , 等,并返回 ,并且右归约确实 , 并返回 。 (例如,如果 是序列 (2, 3, 4) 并且 是除法,左右约减得 ,分别。)如果 只有一个元素,则返回该元素;如果没有元素,NULL被返回。因此,可以确保f总是用 2 个参数调用。

当前的实现是非递归的,以确保稳定性和可扩展性。

Reduce 是根据 Common Lisp 的 reduce 设计的。归约也称为折叠(例如,在 Haskell 中)或累积(例如,在 C++ 标准模板库中)。累积版本对应于Haskell的扫描函数。

Filter应用一元谓词函数f对每个元素x,如有必要,强制逻辑,并返回子集x这给出了 true。请注意,可能NA当前值始终被视为 false;掌控NA将来可能会添加处理。Filter对应于filter在 Haskell 或‘⁠remove-if-not⁠’用 Common Lisp 来说。

FindPosition是按照 Common Lisp 的‘⁠find-if⁠' 和 '⁠position-if⁠', 分别。如果存在谓词函数给出 true 的元素,则返回第一个或最后一个这样的元素或其位置,具体取决于是否right分别为 false(默认)或 true。如果没有这样的元素,则指定的值nomatch被返回。当前的实现并未针对性能进行优化。

Mapmapply 的简单包装器,它不会尝试简化结果,类似于 Common Lisp 的 mapcar(但是参数被回收)。未来的版本可能允许对结果类型进行一些控制。

Negate 对应于 Common Lisp 的 complement 。给定一个(谓词)函数 f ,它创建一个函数,该函数返回 f 返回的逻辑非。

例子

## A general-purpose adder:
add <- function(x) Reduce(`+`, x)
add(list(1, 2, 3))
## Like sum(), but can also used for adding matrices etc., as it will
## use the appropriate '+' method in each reduction step.
## More generally, many generics meant to work on arbitrarily many
## arguments can be defined via reduction:
FOO <- function(...) Reduce(FOO2, list(...))
FOO2 <- function(x, y) UseMethod("FOO2")
## FOO() methods can then be provided via FOO2() methods.

## A general-purpose cumulative adder:
cadd <- function(x) Reduce(`+`, x, accumulate = TRUE)
cadd(seq_len(7))

## A simple function to compute continued fractions:
cfrac <- function(x) Reduce(function(u, v) u + 1 / v, x, right = TRUE)
## Continued fraction approximation for pi:
cfrac(c(3, 7, 15, 1, 292))
## Continued fraction approximation for Euler's number (e):
cfrac(c(2, 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8))

## Map() now recycles similar to basic Ops:
Map(`+`, 1,         1 : 3) ;         1 + 1:3
Map(`+`, numeric(), 1 : 3) ; numeric() + 1:3

## Iterative function application:
Funcall <- function(f, ...) f(...)
## Compute log(exp(acos(cos(0))))
Reduce(Funcall, list(log, exp, acos, cos), 0, right = TRUE)
## n-fold iterate of a function, functional style:
Iterate <- function(f, n = 1)
    function(x) Reduce(Funcall, rep.int(list(f), n), x, right = TRUE)
## Continued fraction approximation to the golden ratio:
Iterate(function(x) 1 + 1 / x, 30)(1)
## which is the same as
cfrac(rep.int(1, 31))
## Computing square root approximations for x as fixed points of the
## function t |-> (t + x / t) / 2, as a function of the initial value:
asqrt <- function(x, n) Iterate(function(t) (t + x / t) / 2, n)
asqrt(2, 30)(10) # Starting from a positive value => +sqrt(2)
asqrt(2, 30)(-1) # Starting from a negative value => -sqrt(2)

## A list of all functions in the base environment:
funs <- Filter(is.function, sapply(ls(baseenv()), get, baseenv()))
## Functions in base with more than 10 arguments:
names(Filter(function(f) length(formals(f)) > 10, funs))
## Number of functions in base with a '...' argument:
length(Filter(function(f)
              any(names(formals(f)) %in% "..."),
              funs))

## Find all objects in the base environment which are *not* functions:
Filter(Negate(is.function),  sapply(ls(baseenv()), get, baseenv()))

也可以看看

parallel 包中的函数 clusterMapmcmapply(非 Windows)提供 Map 的并行版本。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Common Higher-Order Functions in Functional Programming Languages。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。