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