[英]Does lapply apply the function orderly?
我有一個功能列表
functions <- list(f1, f2, f3, ...)
我需要通過所有函數傳遞一個對象x
。 我可以這樣做:
for (fun in functions){
fun(x)
}
函數不返回任何內容,但它們的順序很重要,即f1(x)
必須在f2(x)
之前應用。
因此,我正在考慮使用lapply
:
lapply(functions, function(fun) fun(x))
但我不知道lapply
是否lapply
應用列表functions
的第一個函數,或者它是否遵循另一個訂單。 通過循環,我保證訂購,但它可能會變慢。
任何想法?
問題“傳遞x到......”的措辭表明你認為這將完成一個“組合”,即將函數串行應用於先前應用程序的結果。 您提出的解決方案都不會這樣做,盡管您可以重新設置for
循環來執行此操作。 看一下我在無恥地引用的?funprog
幫助頁面:
## Iterative function application:
Funcall <- function(f, ...) f(...)
## Compute log(exp(acos(cos(0))
Reduce(Funcall, list(log, exp, acos, cos), 0, right = TRUE)
將for
循環版本的結果與Reduce
版本進行比較:
> flist <- list(log, exp, acos, cos)
> arg <- 0; for (f in flist) {arg <- f(arg)}
> arg
[1] 6.123234e-17
> Funcall <- function(f, ...) f(...)
> ## Compute log(exp(acos(cos(0))
> Reduce(Funcall, list(log, exp, acos, cos), 0, right = TRUE)
[1] 0
這表明<something>
實際上正在發生:
arg <- 0; for (f in flist) {arg <- f(arg);cat(arg,"\n")}
-Inf
0
1.570796
6.123234e-17
但它們並不相同,因為right=TRUE
實際上顛倒了應用的順序,並解釋了最終結果中的微不足道的差異。 相比:
arg <- 0; for (f in rev(flist)) {arg <- f(arg);cat(arg,"\n")}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.