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

Ada*_*amC 29 r

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

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

代码:list1 = lapply(mylist, '[', 1,2)工作正常.它返回包含这3个元素的列表.

我正在努力研究这是做什么的.谷歌没有帮助和使用?'['R的帮助不是太解释.我不知道'['R中的函数是怎么样的,所以代码不直观.

Ric*_*rta 39

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

# 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! 
Run Code Online (Sandbox Code Playgroud)

现在,看一下以下参数lapply:

args(lapply)
# function (X, FUN, ...) 
Run Code Online (Sandbox Code Playgroud)

这些点中表示的所有内容都FUN作为参数传递给函数.

因此,当FUN="["第一个参数为"["列表的当前元素(被迭代)时,即,对象被子集化.而后续的参数是索引"["


Ari*_*man 22

R中的运算符只是函数.

这些是等价的:

> x <- list(a=1,b=2)
> x[1]
$a
[1] 1

> `[`(x,1)
$a
[1] 1
Run Code Online (Sandbox Code Playgroud)

反引号只是为了防止解析器的解释(例如,告诉它它是一个函数名,而不是开始[过早地解释).

作为一个函数,它遵循相同的面向对象规则(在本例中为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
Run Code Online (Sandbox Code Playgroud)

+,=等等和其他运营商也都这样工作.

  • 很好的解释 - 给出一个'其他运算符',`"/"(1,2)`和`1/2`和`do.call("/",list(1,2))的例子`同样的结果. (2认同)
  • @thelatemail在base中,有`Reduce('/',list(1,2))`,`Map('/',1,2)`和所有*`apply`s,它们也将函数作为参数,也许更多(?)...... (2认同)