Создать числовой вектор с именами в одном выражении?
Я пытаюсь установить значение по умолчанию для параметра функции на именованный номер. Есть ли способ создать его в одном заявлении? Я проверил? Числовой и? Вектор, но это не так. Возможно, я могу преобразовать/принудить матрицу или data.frame и добиться того же результата в одном выражении? Чтобы быть ясным, я пытаюсь сделать следующее за один выстрел:
test = c( 1 , 2 )
names( test ) = c( "A" , "B" )
Ответы
Ответ 1
Соглашение об именовании векторных элементов такое же, как со списками:
newfunc <- function(A=1, B=2) { body} # the parameters are an 'alist' with two items
Если бы вы хотели, чтобы это был параметр, который был именованным вектором (вид функции, которая обрабатывала бы аргументы, предоставленные apply
):
newfunc <- function(params =c(A=1, B=2) ) { body} # a vector wtih two elements
Если вместо этого вы хотите, чтобы это был параметр, который был именованным списком:
newfunc <- function(params =list(A=1, B=2) ) { body}
# a single parameter (with two elements in a list structure
Ответ 2
... как побочная заметка, функция structure
позволяет вам устанавливать ВСЕ атрибуты, а не только имена:
structure(1:10, names=letters[1:10], foo="bar", class="myclass")
Что создаст
a b c d e f g h i j
1 2 3 4 5 6 7 8 9 10
attr(,"foo")
[1] "bar"
attr(,"class")
[1] "myclass"
Ответ 3
Для этой цели создана функция setNames()
. Как описано в Advanced R и ?setNames
:
test <- setNames(c(1, 2), c("A", "B"))
Ответ 4
Как насчет:
c(A = 1, B = 2)
A B
1 2
Ответ 5
magrittr предлагает хорошее и чистое решение.
result = c(1,2) %>% set_names(c("A", "B"))
print(result)
A B
1 2
Вы также можете использовать его для преобразования data.frames в векторы.
df = data.frame(value=1:10, label=letters[1:10])
vec = extract2(df, 'value') %>% set_names(df$label)
vec
a b c d e f g h i j
1 2 3 4 5 6 7 8 9 10
df
value label
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
6 6 f
7 7 g
8 8 h
9 9 i
10 10 j