Ответ 1
Я думаю, что вы получаете форму 1 аргумента [
. Если вы выполняете lapply(myList, `[`, i =, j = 1)
, это работает.
Рассмотрим следующую ситуацию, когда у меня есть список 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
Я подозреваю, что получаю неправильный метод [
, но я не могу понять почему? Мысли?
Я думаю, что вы получаете форму 1 аргумента [
. Если вы выполняете lapply(myList, `[`, i =, j = 1)
, это работает.
После двух пинтов самого высокого эля в Британии и немного соображений, я понимаю, что эта версия будет работать:
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]’.
И это объясняет мое затруднение выше. Да, для фактического чтения документации.
Это потому, что [
является .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*
Хотя это действительно просто задает вопрос о том, как [
отправляется на объекты матрицы...