I would like to use apply to run across the rows of a matrix, and I would like to use the rowname of the current row in my function. It seems you can't use rownames
, colnames
, dimnames
or names
directly inside the function. I am aware that I can probably create a workaround based on information in this question.
But my question is how does apply
handle row and column names of the array in it's first argument, and the assignment of names to objects created inside the function called by apply
? It seems a bit inconsistent, as I hope to show by the following example. Is there a reason why it was designed like this?
# Toy data
m <- matrix( runif(9) , nrow = 3 )
rownames(m) <- LETTERS[1:3]
colnames(m) <- letters[1:3]
m
a b c
A 0.5092062 0.3786139 0.120436569
B 0.7563015 0.7127949 0.003358308
C 0.8794197 0.3059068 0.985197273
# These return NULL
apply( m , 1 , FUN = function(x){ rownames(x) } )
NULL
apply( m , 1 , FUN = function(x){ colnames(x) } )
NULL
apply( m , 1 , FUN = function(x){ dimnames(x) } )
NULL
# But...
apply( m , 1 , FUN = function(x){ names(x) } )
A B C
[1,] "a" "a" "a"
[2,] "b" "b" "b"
[3,] "c" "c" "c"
# This looks like a column-wise matrix of colnames, with the rownames of m as the column names to me
# And further you can get...
n <- apply( m , 1 , FUN = function(x){ names(x) } )
dimnames(n)
[[1]]
NULL
[[2]]
[1] "A" "B" "C"
# But you can't do...
apply( m , 1 , FUN = function(x){ n <- names(x); dimnames(n) } )
NULL
I just want to understand what happens internally in apply? Many thanks.