《Learning R》筆記 Chapter 9 上 隱式循環(huán) in Lists

R的精華部分就在這一章。
這一章需要明確的是不同的apply函數(shù)擁有不同的輸入輸出格式。

簡單重復(fù)

replicate可以直接將某個(gè)函數(shù)重復(fù)進(jìn)行n次,輸出結(jié)果默認(rèn)為一個(gè)array:

replicate(n, expr, simplify = "array")

List內(nèi)循環(huán)

書中的例子使用了unique函數(shù),可以輸出某vector中所有unique的元素。
lapply()接受一個(gè)list作為輸入,輸出一個(gè)list,輸出list的names等于原list。

lapply(X, FUN, ...)

如果lapply輸出的結(jié)果全部都是同樣長度的話,可以用簡化版的vapply()。輸出的就是一個(gè)vector或者array,名稱依然來自輸入的list。vapply額外接受一個(gè)參數(shù)來描述輸出結(jié)果的形式。一旦輸出結(jié)果的長度不一致就會報(bào)錯(cuò)。

vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)
#R對FUN.VALUE的**長度**敏感。如果length()為1,則返回1個(gè)vector.
#如果length()大于等于2,則返回一個(gè)matrix,其nrow為length(),ncol為原list的length()。

sapply()則是一個(gè)lapply的簡化版/wrapper,它不需要FUN.VALUE這樣的模板。如果輸入的X長度不為零,而且每個(gè)隱循環(huán)輸出結(jié)果長度一致,就會自行嘗試簡化輸出結(jié)果,簡化輸出的結(jié)果格式會被強(qiáng)行一致化:the output type is determined from the highest type of the return values in the hierarchy NULL < raw < logical < integer < double < complex < character < list < expression, after coercion of pairlists to lists。換言之,sapply的輸出結(jié)果會被強(qiáng)行轉(zhuǎn)換為array(通常是matrix),而array內(nèi)的元素只能有一種type。這一特性有時(shí)可能會造成不便和意料之外的輸出。

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)

可以發(fā)現(xiàn)在lapply、vapply和sapply的參數(shù)列表中都有“...”,這意味著我們可以額外向FUN中傳遞其他的參數(shù)。如果要傳遞進(jìn)更多的參數(shù),應(yīng)當(dāng)嘗試自定義函數(shù):

> sapply(1:6, rep.int , times=2:7)
Error in FUN(X[[i]], ...) : invalid 'times' value
> sapply(1:6, rep.int , times=2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    1    2    3    4    5    6

另外還有用的較少的eapply和rapply。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容