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

Как использовать `[` правильно с (l | s) применить для выбора определенного столбца из списка матриц?

Рассмотрим следующую ситуацию, когда у меня есть список n матриц (это только фиктивные данные в примере ниже) в объекте myList

mat <- matrix(1:12, ncol = 3)
myList <- list(mat1 = mat, mat2 = mat, mat3 = mat, mat4 = mat)

Я хочу выбрать конкретный столбец из каждой из матриц и сделать с ним что-то. Это даст мне первый столбец каждой матрицы и вернет его как матрицу (lapply() предоставит мне список либо отлично).

sapply(myList, function(x) x[, 1])

То, что я не могу сделать, это использовать [ непосредственно как функцию в моих заклинаниях sapply() или lapply(). ?'[' говорит мне, что мне нужно указать аргумент j в качестве идентификатора столбца. Так что я делаю неправильно, что это не работает?

> lapply(myList, `[`, j = 1)
$mat1
[1] 1

$mat2
[1] 1

$mat3
[1] 1

$mat4
[1] 1

Где бы я ожидал этого:

$mat1
[1] 1 2 3 4

$mat2
[1] 1 2 3 4

$mat3
[1] 1 2 3 4

$mat4
[1] 1 2 3 4

Я подозреваю, что получаю неправильный метод [, но я не могу понять почему? Мысли?

4b9b3361

Ответ 1

Я думаю, что вы получаете форму 1 аргумента [. Если вы выполняете lapply(myList, `[`, i =, j = 1), это работает.

Ответ 2

После двух пинтов самого высокого эля в Британии и немного соображений, я понимаю, что эта версия будет работать:

lapply(myList, `[`, , 1)

то есть. не называйте ничего и относитесь к нему так, как я сделал mat[ ,1]. Все еще не grep, почему naming j не работает...

... на самом деле, более внимательно прочитав ?'[', я замечаю следующий раздел:

Argument matching:

     Note that these operations do not match their index arguments in
     the standard way: argument names are ignored and positional
     matching only is used.  So ‘m[j=2,i=1]’ is equivalent to ‘m[2,1]’
     and *not* to ‘m[1,2]’.

И это объясняет мое затруднение выше. Да, для фактического чтения документации.

Ответ 3

Это потому, что [ является .Primitive. Он не имеет аргумента j. И нет метода [.matrix.

> `[`
.Primitive("[")
> args(`[`)
NULL
> methods(`[`)
 [1] [.acf*            [.AsIs            [.bibentry*       [.data.frame     
 [5] [.Date            [.difftime        [.factor          [.formula*       
 [9] [.getAnywhere*    [.hexmode         [.listof          [.noquote        
[13] [.numeric_version [.octmode         [.person*         [.POSIXct        
[17] [.POSIXlt         [.raster*         [.roman*          [.SavedPlots*    
[21] [.simple.list     [.terms*          [.ts*             [.tskernel* 

Хотя это действительно просто задает вопрос о том, как [ отправляется на объекты матрицы...