我已经看到在R中使用的函数lapply
可以从存在于矩阵列表中的矩阵中提取元素。在R中使用'['方括号作为lapply的函数R
E.g.我有一个3(2×2)矩阵的列表,我想从这3个矩阵的每一个中提取元素[1,2]。
该代码:list1 = lapply(mylist, '[', 1,2)
工作得很好。它返回一个包含这3个元素的列表。
我在努力研究这正是在做什么。谷歌没有帮助,在R的帮助中使用?'['
不是太明显。我没有看到'['
是R中的一个函数,所以代码并不直观。
我已经看到在R中使用的函数lapply
可以从存在于矩阵列表中的矩阵中提取元素。在R中使用'['方括号作为lapply的函数R
E.g.我有一个3(2×2)矩阵的列表,我想从这3个矩阵的每一个中提取元素[1,2]。
该代码:list1 = lapply(mylist, '[', 1,2)
工作得很好。它返回一个包含这3个元素的列表。
我在努力研究这正是在做什么。谷歌没有帮助,在R的帮助中使用?'['
不是太明显。我没有看到'['
是R中的一个函数,所以代码并不直观。
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
+
,=
等,以及其他运营商的所有工作这种方式为好。
很好的解释 - 举例说明'其他操作符','/'(1,2)'和'1/2'和'do.call(“/”,列表(1,2))'全部给出相同的结果。 – thelatemail
关于带星号的函数,请参见[如何查看函数的源代码?](http://stackoverflow.com/a/19226817/1191259) – Frank
@thelatemail在基础中,有'Reduce('/',list (1,2))','Map('/',1,2)'和所有以函数作为参数的''apply',也许更多(?)... – Frank
方括号实际上是一个函数,其第一个参数是被子集的对象。后续参数是该子集的索引。
# 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="["
,"["
的第一个参数是列表的当前元素(被迭代),即被子集的对象。虽然后面的参数是"["
的索引
相关:http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this –
正如其他人指出的,'['绝对是一个函数。还有一些赋值功能(例如:'[<-'),当您在'<-'上使用多种变体时(如该链接中的@AriB.Friedman笔记)。例如,尝试类似这两个命令:'x < - 1:5; “[< - ”(x,1,10);' – thelatemail
** R中的所有**都是一个对象,如果它*有*,那么对象的类型就是函数。 – Gregor