Comment concaténer des listes dans Rcpp


SeGa

Je veux c()2 listes dans Rcpp, mais j'ai du mal à obtenir la même structure que je le ferais dans R.

Voici quelques données simples + exemple:

rlist = list(a = "123")
listadd = list(typ = "fdb")
c(rlist, listadd)

ce qui me donne ceci:

$a
[1] "123"

$typ
[1] "fdb"

Avec Rcpp, je n'ai trouvé push_backqu'à faire plus ou moins ce que je voulais mais la structure est un peu différente. J'ai également essayé d'utiliser emplace_backsur la base de cette référence mais cela ne semble pas être implémenté dans Rcpp.

cppFunction('
List cLists(List x, List y) {
  x.push_back(y);
  return(x);
}')

ce qui me donne:

cLists(rlist, listadd)
$a
[1] "123"

[[2]]
[[2]]$typ
[1] "fdb"

Sur la base de cette question, je sais que je pourrais utiliser Language("c",x,y).eval();la c()fonction de R et obtenir le résultat correct, mais cela ne semble pas être la bonne manière.

Je me demandais donc comment concaténer correctement des listes dans Rcpp?

EDIT: Sur la base du commentaire de @ Dirk, j'ai essayé de créer une nouvelle liste et de les remplir avec les autres éléments de la liste, mais j'ai perdu les noms des éléments.

cppFunction('
List cLists(List x, List y) {
  int nsize = x.size(); 
  int msize = y.size(); 
  List out(nsize + msize);

  for(int i = 0; i < nsize; i++) {
    out[i] = x[i];
  }
  for(int i = 0; i < msize; i++) {
    out[nsize+i] = y[i];
  }
  return(out);
}')

Production:

cLists(rlist, listadd)
[[1]]
[1] "123"

[[2]]
[1] "fdb"
thc

Les performances affectées pour votre implémentation semblent provenir de la copie de l' nameattribut dans des vecteurs de chaîne stl. Vous pouvez l'éviter comme ceci:

library(Rcpp)
library(microbenchmark)
cppFunction('
List cLists(List x, List y) {
  int nsize = x.size(); 
  int msize = y.size(); 
  List out(nsize + msize);

  CharacterVector xnames = x.names();
  CharacterVector ynames = y.names();
  CharacterVector outnames(nsize + msize);
  out.attr("names") = outnames;
  for(int i = 0; i < nsize; i++) {
    out[i] = x[i];
    outnames[i] = xnames[i];
  }
  for(int i = 0; i < msize; i++) {
    out[nsize+i] = y[i];
    outnames[nsize+i] = ynames[i];
  }

  return(out);
}')

x <- as.list(runif(1e6)); names(x) <- sample(letters, 1e6, T)
y <- as.list(runif(1e6)); names(y) <- sample(letters, 1e6, T)

microbenchmark(cLists(x,y), c(x,y), times=3)
Unit: milliseconds
         expr      min       lq     mean   median       uq      max neval cld
 cLists(x, y) 31.70104 31.86375 32.09983 32.02646 32.29922 32.57198     3  a 
      c(x, y) 47.31037 53.21409 56.41159 59.11781 60.96220 62.80660     3   b

Remarque: en copiant sur, std::stringvous perdez également d'éventuelles informations d'encodage de caractères, alors que travailler uniquement avec R / Rcpp préserve.

Articles connexes


Comment concaténer des listes en dataframe dans Pandas

Erhan Rden c1=["q","q","q","q","q","q"] c2=["x","x","x","x","x","x"] c3=["w","w","w","w","w","w"] ca=["c","e","a","d"] cb=["y","z","s","f"] cc=["y","z","s","f"] df1=pd.DataFrame(c1, columns=['c1']) df2=pd.DataFrame(c2, columns=['c2']) df3=pd.DataFrame(c3, colu

Comment concaténer des listes en C #?

Mat Si j'ai: List<string> myList1; List<string> myList2; myList1 = getMeAList(); // Checked myList1, it contains 4 strings myList2 = getMeAnotherList(); // Checked myList2, it contains 6 strings myList1.Concat(myList2); // Checked mylist1, it contains 4 str

Concaténer des listes dans Clojure sans utiliser concat

ewell128 Je suis nouveau sur clojure et j'essaie de comprendre comment concaténer des listes sans utiliser la fonction concat. (defn append [list1, list2] (cond (nil? list1) list2 :else (cons (first list1) (append (rest list1) (list2))))

Concaténer des caractères dans des listes imbriquées

Yonathan Je travaille actuellement avec une structure de données qui se présente comme ceci : ['t','h','i','s',' ','i','s',' ','q','u','e','r','y',' ','i','t','e','m',' ','1','t','h','i','s',' ','i','s',' ','q','u','e','r','y',' ','i','t','e','m',' ','2', ['t'

Comment concaténer des listes (et autres collections) en F #?

Tim Lovell-Smith F # fournit-il des moyens idiomatiques de concaténer séquence et liste ensemble? liste et liste ensemble dans une liste? (non destructif) liste et liste ensemble dans une liste si elle est destructrice? tableaux mutables ensemble, de manière d