Использование '[' квадратная скобка как функция для lapply в R
Я видел функцию lapply
, используемую в R, для извлечения элементов из матриц, которые существуют в списке матриц.
например. У меня есть список из 3 (2x2) матриц, и я хочу извлечь элемент [1,2] из каждой из этих 3-х матриц.
Код: list1 = lapply(mylist, '[', 1,2)
работает отлично. Он возвращает список с этими тремя элементами.
Я пытаюсь исследовать, что именно это делает. Google не помог и использование ?'['
в 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
+
, =
и т.д., и другие операторы работают так же.