使用'['方括号作为R中lapply的函数

时间:2013-10-09 00:31:11

标签: r

我已经看到R中使用的函数lapply从矩阵列表中的矩阵中提取元素。

E.g。我有一个3(2x2)矩阵的列表,我想从这3个矩阵中的每一个中提取元素[1,2]。

代码:list1 = lapply(mylist, '[', 1,2)效果很好。它返回一个包含这3个元素的列表。

我正在尝试研究这是做什么的。谷歌没有帮助,在R帮助中使用?'['并没有太多解释。我没有看到'['是如何在R中的函数,所以代码不直观。

2 个答案:

答案 0 :(得分:33)

方括号实际上是一个函数,其第一个参数是被子集化的对象。后续参数是该子集的索引。

# 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="["时,"["的第一个参数是列表的当前元素(被迭代),即被子集化的对象。后续参数是"["

的索引

答案 1 :(得分:21)

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

+=等等,其他运营商也都这样做。