當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。