我已经看到lapply
R 中用于从存在于矩阵列表中的矩阵中提取元素的函数。
例如,我有一个 3 (2x2) 矩阵的列表,我想从这 3 个矩阵中的每一个中提取元素 [1,2]。
代码:list1 = lapply(mylist, '[', 1,2)
工作得很好。它返回一个包含这 3 个元素的列表。
我正在尝试研究这到底在做什么。谷歌没有提供帮助,并且?'['
在 R 帮助中使用并不太解释。我看不到'['
R 中的函数如何,因此代码不直观。
我已经看到lapply
R 中用于从存在于矩阵列表中的矩阵中提取元素的函数。
例如,我有一个 3 (2x2) 矩阵的列表,我想从这 3 个矩阵中的每一个中提取元素 [1,2]。
代码:list1 = lapply(mylist, '[', 1,2)
工作得很好。它返回一个包含这 3 个元素的列表。
我正在尝试研究这到底在做什么。谷歌没有提供帮助,并且?'['
在 R 帮助中使用并不太解释。我看不到'['
R 中的函数如何,因此代码不直观。
方括号实际上是一个函数,它的第一个参数是被子集的对象。后续参数是该子集的索引。
# 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="["
,第一个参数"["
是列表的当前元素(被迭代),即被子集的对象。而随后的参数是索引"["
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
+
, =
, 等以及其他运算符也都以这种方式工作。