37

我已经看到lapplyR 中用于从存在于矩阵列表中的矩阵中提取元素的函数。

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

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

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

4

2 回答 2

47

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

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

于 2013-10-09T00:42:31.983 回答
24

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

+, =, 等以及其他运算符也都以这种方式工作。

于 2013-10-09T00:42:21.463 回答