2013-10-09 92 views
18

我已經看到在R中使用的函數lapply可以從存在於矩陣列表中的矩陣中提取元素。在R中使用'['方括號作爲lapply的函數R

E.g.我有一個3(2×2)矩陣的列表,我想從這3個矩陣的每一箇中提取元素[1,2]。

該代碼:list1 = lapply(mylist, '[', 1,2)工作得很好。它返回一個包含這3個元素的列表。

我在努力研究這正是在做什麼。谷歌沒有幫助,在R的幫助中使用?'['不是太明顯。我沒有看到'['是R中的一個函數,所以代碼並不直觀。

+0

相關:http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this –

+3

正如其他人指出的,'['絕對是一個函數。還有一些賦值功能(例如:'[<-'),當您在'<-'上使用多種變體時(如該鏈接中的@AriB.Friedman筆記)。例如,嘗試類似這兩個命令:'x < - 1:5; 「[< - 」(x,1,10);' – thelatemail

+3

** R中的所有**都是一個對象,如果它*有*,那麼對象的類型就是函數。 – Gregor

回答

19

R中的運算符只是函數。

這些相當於:

> x <- list(a=1,b=2) 
> x[1] 
$a 
[1] 1 

> `[`(x,1) 
$a 
[1] 1 

的反引號是必要的只是防止解釋解析器(例如告訴它這是一個函數名不啓動解釋[過早)。

作爲一個函數,它遵循與其他所有內容相同的面向對象規則(在本例中爲S3)。

> methods(`[`) 
[1] [.acf*    [.arrow*   [.AsIs    [.bibentry*  [.cluster*   [.data.frame  [.data.table*  
[8] [.Date    [.difftime   [.envlist*   [.factor   [.formula*   [.fractions*  [.getAnywhere*  
[15] [.gList*   [.gpar*   [.gtable*   [.hexmode   [.idf*    [.indexed*   [.insensitive*  
[22] [.ITime*   [.listof   [.noquote   [.numeric_version [.octmode   [.pdf_doc*   [.person*   
[29] [.POSIXct   [.POSIXlt   [.quoted*   [.raster*   [.roman*   [.shingle*   [.simple.list  
[36] [.split*   [.terms*   [.trellis*   [.ts*    [.tskernel*  [.uneval*   [.unit*   
[43] [.unit.arithmetic* [.unit.list*  [.vpPath*   

    Non-visible functions are asterisked 

+=等,以及其他運營商的所有工作這種方式爲好。

+2

很好的解釋 - 舉例說明'其他操作符','/'(1,2)'和'1/2'和'do.call(「/」,列表(1,2))'全部給出相同的結果。 – thelatemail

+1

關於帶星號的函數,請參見[如何查看函數的源代碼?](http://stackoverflow.com/a/19226817/1191259) – Frank

+2

@thelatemail在基礎中,有'Reduce('/',list (1,2))','Map('/',1,2)'和所有以函數作爲參數的''apply',也許更多(?)... – Frank

27

方括號實際上是一個函數,其第一個參數是被子集的對象。後續參數是該子集的索引。

# For example, if M is a matrix 
M[1, 2] # extracts the element at row 1, col 2 
# is the same as 
`[`(M, 1, 2) 
# Try them! 

現在,看看在參數lapply:在這些點代表

args(lapply) 
# function (X, FUN, ...) 

一切大幹快上的功能FUN作爲參數傳遞。

因此,當FUN="[""["的第一個參數是列表的當前元素(被迭代),即被子集的對象。雖然後面的參數是"["的索引