86 votes

Créer un vecteur numérique avec des noms dans une seule déclaration ?

J'essaie de définir la valeur par défaut d'un paramètre de fonction sur un numérique nommé. Existe-t-il un moyen d'en créer un dans une seule déclaration ? J'ai coché ?numeric et ?vector mais cela ne semble pas le cas. Peut-être que je peux convertir/contraindre une matrice ou un data.frame et obtenir le même résultat en une seule instruction ? Pour être clair, j'essaie de faire ce qui suit d'un seul coup :

 test = c( 1 , 2 )
names( test ) = c( "A" , "B" )

136voto

Aaron Schumacher Points 317

La fonction setNames() est faite à cet effet. Comme décrit dans Advanced R et ?setNames :

 test <- setNames(c(1, 2), c("A", "B"))

67voto

Tommy Points 16323

...en passant, la fonction structure vous permet de définir TOUS les attributs, pas seulement les noms :

 structure(1:10, names=letters[1:10], foo="bar", class="myclass")

Ce qui produirait

  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"

65voto

joran Points 68079

Que diriez-vous:

  c(A = 1, B = 2)
A B 
1 2 

20voto

BondedDust Points 105234

La convention pour nommer les éléments vectoriels est la même que pour les listes :

 newfunc <- function(A=1, B=2) { body}  # the parameters are an 'alist' with two items

Si à la place vous vouliez que ce soit un paramètre qui était un vecteur nommé (le genre de fonction qui gérerait les arguments fournis par apply ):

 newfunc <- function(params =c(A=1, B=2) ) { body} # a vector wtih two elements

Si à la place vous vouliez que ce soit un paramètre qui était une liste nommée :

 newfunc <- function(params =list(A=1, B=2) ) { body} 
    # a single parameter (with two elements in a list structure

6voto

Sebastian Points 583

magrittr offre une solution agréable et propre.

 result = c(1,2) %>% set_names(c("A", "B"))
print(result)
A B 
1 2

Vous pouvez également l'utiliser pour transformer data.frames en vecteurs.

 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X