我已经看到R中使用的函数lapply
从矩阵列表中的矩阵中提取元素。
E.g。我有一个3(2x2)矩阵的列表,我想从这3个矩阵中的每一个中提取元素[1,2]。
代码:list1 = lapply(mylist, '[', 1,2)
效果很好。它返回一个包含这3个元素的列表。
我正在尝试研究这是做什么的。谷歌没有帮助,在R帮助中使用?'['
并没有太多解释。我没有看到'['
是如何在R中的函数,所以代码不直观。
答案 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
+
,=
等等,其他运营商也都这样做。