2014-02-05 2 views
2

Я хотел бы получить имена каждого измерения для заданного вектора, матрицы или массива. Что-то вроде:Функция для получения фактических dimnames()

a = matrix(1, nrow=2, ncol=2, dimnames=list(c('a','b'),c('x','y'))) 

dimnames(a) 
# [[1]] 
# [1] "a" "b" 
# 
# [[2]] 
# [1] "x" "y" 

Пока что так хорошо. Если размер не имеет имен, он должен возвращать значение NULL:

b = c(1:5) 

dimnames(b) 
# NULL 

Также отлично работает. Однако, когда я делаю:

a2 = matrix(1, nrow=2, ncol=2) 

dimnames(a2) 
# NULL 

NULL Это дает, даже если есть две оси имен, которые каждыйNULL. Поэтому я хотел бы ожидать, что результат будет:

# [[1]] 
# NULL 
# [[2]] 
# NULL 

вместо один дается dimnames().

Есть ли способ сделать это?

ответ

2

Я не думаю, что есть что-то встроенный в базовый R. Но это довольно легко написать свой собственный:

dimnames2 <- function(x) { 
    if (is.vector(x)) { 
    list(names(x)) 
    } else { 
    d <- dimnames(x) 
    if (is.null(d)) { 
     rep(list(NULL), length(dim(x))) 
    } else { 
     d 
    } 
    } 
} 

dimnames2(1:10) 
dimnames2(matrix(1:10)) 
+0

работает как шарм, спасибо. –

1

Вот один вкладыш, чтобы сделать по существу, что делает Хэдли (получено независимо, I клянусь ;-)):

> dimnames2 = function (x) dimnames(x) %else% rep(list(NULL), length(dim(x))) 
> dimnames2(a) 
[[1]] 
[1] "a" "b" 

[[2]] 
[1] "x" "y" 
> dimnames2(a2) 
[[1]] 
NULL 

[[2]] 
NULL 

Ах да, я обманул. %else% эквивалентно оператору нуль-срастаться в C#, или or в Perl, Ruby, PHP ...:

`%else%` = function (a, b) if (identical(a, FALSE) || is.null(a) || length(a) == 0) b else a 
+0

Мне нравится '% else%', вы можете добавить предложение 'FALSE':' x = F% else% print («это работает») ' –

+0

Не совсем то же самое, потому что ваша функция работает только для' matrix ', но op хочет получить результат для' vector'. BTW, эта функция% else% действительно удобна – dickoa

+0

И для 'table', и других странных типов данных. Поэтому я называю 'as.array()' в начале, это должно быть хорошо. –