funprog
位于 base
包(package)。 说明
Reduce
-
使用二元函数连续组合给定向量的元素和可能给定的初始值。
Filter
-
提取谓词(逻辑)函数给出 true 的向量元素。
Find
和Position
-
分别给出第一个或最后一个这样的元素及其在向量中的位置。
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 |
适当数量的函数(二进制为 |
x |
一个向量。 |
init |
一个R与元素相同类型的对象 |
right |
指示是从左到右(默认)还是从右到左进行的逻辑。 |
accumulate |
指示是否应累积连续归约组合的逻辑。默认情况下,仅使用最终组合。 |
simplify |
一个逻辑,指示累积结果是否应该被简化(通过取消列出),以防它们都是长度一。 |
nomatch |
找到“no match”(没有满足谓词的元素)时返回的值。 |
... |
该函数是 |
细节
如果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 来说。
Find
和Position
是按照 Common Lisp 的‘find-if' 和 'position-if', 分别。如果存在谓词函数给出 true 的元素,则返回第一个或最后一个这样的元素或其位置,具体取决于是否right
分别为 false(默认)或 true。如果没有这样的元素,则指定的值nomatch
被返回。当前的实现并未针对性能进行优化。
Map
是 mapply
的简单包装器,它不会尝试简化结果,类似于 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
包中的函数 clusterMap
和 mcmapply
(非 Windows)提供 Map
的并行版本。
相关用法
- R function 函数定义
- R file.path 构造文件路径
- R formals 访问和操纵形式参数
- R findInterval 查找区间数或索引
- R formatDL 格式说明列表
- R force 强制评估论证
- R file.info 提取文件信息
- R format 以通用格式编码
- R file.show 显示一个或多个文本文件
- R factor 因子
- R formatC 使用 C 样式格式进行格式化
- R file.access 确定文件的可访问性
- R format.pval 设置 P 值格式
- R files 文件操作
- R file.choose 交互式选择文件
- R files2 目录和文件权限的操作
- R forceAndCall 调用带有强制参数的函数
- R format.info 格式(.)信息
- R find.package 查找套餐
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Common Higher-Order Functions in Functional Programming Languages。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。