【问题标题】:Using '[' square bracket as a function for lapply in R在 R 中使用 '[' 方括号作为 lapply 的函数
【发布时间】:2013-10-09 00:31:10
【问题描述】:

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

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

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

我正在尝试研究这到底在做什么。谷歌没有提供帮助,在 R 帮助中使用 ?'[' 并不太解释。我看不出'['是R中的一个函数,所以代码不直观。

【问题讨论】:

  • 正如其他人指出的那样,[ 绝对是一个函数。当您使用<- 的许多变体时,还有分配函数(例如:[<-)会介入(正如该链接中的@AriB.Friedman 注释)。例如,尝试以下 2 个命令:x <- 1:5; "[<-"(x,1,10);
  • Everything 在 R 中是一个对象......如果它某事,那么对象的类型就是函数。

标签: r


【解决方案1】:

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

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

【讨论】:

  • 有没有像"[""("这样的“特殊”功能的列表?还有"{"的功能吗?最后,我的问题是如何获得这种知识?
【解决方案2】:

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/2do.call("/",list(1,2)) 都给出相同的结果。
  • 关于带星号的函数,见How can I view the source code for a function?
  • @thelatemail 在基础中,有 Reduce('/',list(1,2))Map('/',1,2) 和所有将函数作为参数的 *applys,也许还有更多(?)...
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多