2016-08-09 2 views
1

Je me demandais s'il était possible de définir les noms des éléments d'une liste à la fin d'un code pipeline.setnames dans le pipeline R code

data <- input_vars %>% 
    purrr::map(get_data) 

    names(data) <- input_vars 

Actuellement, je passe une chaîne de variables dans une fonction qui récupère une liste de données. Malheureusement cette liste n'a pas automatiquement d'éléments nommés, mais je les ajoute "manuellement" après. Afin d'améliorer la lisibilité, je voudrais avoir quelque chose comme suit

data <- input_vars%>% 
    purrr::map(get_comm_data) %>% 
    setnames(input_vars) 

Cependant, cela me donne l'erreur suivante: (., Input_vars) Erreur dans setnames: x est pas un data.table ou data.frame

Est-ce que quelqu'un a une solution élégante à cela?

Toute aide est appréciée!

+0

Ce serait plus facile avec un exemple reproductible. Ici, 'setnames' si une fonction est exportée du paquetage' data.table' et que vous ne semblez pas travailler avec 'data.table'. La fonction Base R est 'setNames' et devrait fonctionner. Vous pouvez également utiliser 'set_names' du paquet' purrr'. – cderv

+0

Vous devriez lire les docs pour les fonctions que vous essayez d'utiliser, pas simplement deviner le nom de la fonction dont vous avez besoin. Dans ce cas, essayez '? Setnames'. – Frank

Répondre

4

Pour définir les noms d'un objet dans un pipeline, utilisez setNames ou purrr::set_names

1:3 %>% 
    purrr::map(~ rnorm(5, .x)) %>% 
    purrr::set_names(paste0('V', 1:3)) 
#> $V1 
#> [1] 1.4101568 2.0189473 1.0042691 1.4561920 0.8683156 
#> 
#> $V2 
#> [1] 2.0577889 2.4805984 1.4519552 0.9438844 0.4097615 
#> 
#> $V3 
#> [1] 0.4065113 4.0044538 2.8644864 2.4632038 4.0581380 
1:3 %>% 
    purrr::map(~ rnorm(5, .x)) %>% 
    setNames(paste0('V', 1:3)) 
#> $V1 
#> [1] 0.52503624 0.69096126 0.08765667 0.97904520 0.29317579 
#> 
#> $V2 
#> [1] 2.561081 1.535689 1.681768 2.739482 1.842833 
#> 
#> $V3 
#> [1] 2.619798 1.341227 2.897310 2.860252 1.664778 

Avec purrr::map vous pouvez nommer aussi votre input_vars comme map garder les noms.

c(V1 = 1, V2 = 2, V3 = 3) %>% 
    purrr::map(~ rnorm(5, .x)) 
#> $V1 
#> [1] 1.74474389 1.69347668 -1.03898393 0.09779935 0.95341349 
#> 
#> $V2 
#> [1] 1.5993430 0.8684279 1.6690726 2.9890697 3.8602331 
#> 
#> $V3 
#> [1] 3.453653 3.392207 2.734143 1.256568 3.692433