Подтвердить что ты не робот

Использование '[' квадратная скобка как функция для lapply в R

Я видел функцию lapply, используемую в R, для извлечения элементов из матриц, которые существуют в списке матриц.

например. У меня есть список из 3 (2x2) матриц, и я хочу извлечь элемент [1,2] из каждой из этих 3-х матриц.

Код: list1 = lapply(mylist, '[', 1,2) работает отлично. Он возвращает список с этими тремя элементами.

Я пытаюсь исследовать, что именно это делает. Google не помог и использование ?'[' в R-помощи не слишком объяснимо. Я не вижу, как '[' является функцией в R, поэтому код не интуитивно понятен.

4b9b3361

Ответ 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

+, = и т.д., и другие операторы работают так же.