37

lapply行列のリストに存在する行列から要素を抽出するために R で使用される関数を見てきました。

たとえば、3 つの (2x2) 行列のリストがあり、これらの 3 つの行列のそれぞれから要素 [1,2] を抽出したいとします。

コード:list1 = lapply(mylist, '[', 1,2)正常に動作します。これらの 3 つの要素を含むリストを返します。

私はこれが正確に何をしているのかを研究しようとしています。Google は?'['役に立たず、R ヘルプでの使用はあまり説明的ではありません。'['R の関数がどのようになっているのかわからないため、コードは直感的ではありません。

4

2 に答える 2

47

角括弧は実際には、最初の引数がサブセット化されるオブジェクトである関数です。後続の引数は、そのサブセットへのインデックスです。

# 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="["、 の最初の引数"["はリストの現在の要素 (反復される)、つまりサブセット化されるオブジェクトです。後続の引数はへのインデックスですが、"["

于 2013-10-09T00:42:31.983 に答える
24

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

+=など、その他の演算子もすべてこのように機能します。

于 2013-10-09T00:42:21.463 に答える