2013-10-09 63 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="[""["的第一个参数是列表的当前元素(被迭代),即被子集的对象。虽然后面的参数是"["的索引