J'écris un package R qui manipule les matrices en C. Actuellement, les matrices renvoyées à R ont des chiffres pour les noms de lignes / colonnes. Je préférerais attribuer mes propres noms de lignes / colonnes lors de la modification de l'objet dans C.
J'ai googlé environ une heure, mais je n'ai pas encore trouvé de bonne solution. Le plus proche que j'ai trouvé est Dim Noms, mais je veux nommer chaque colonne, pas seulement les deux dimensions. Les matrices deviennent plus grandes que 4x4, ci-dessous est juste un petit exemple de ce que je veux faire. P>
Le nombre de lignes est 4 ^ x où x est la longueur du nom de la ligne p>
Current
[,1] [,2] [,3] [,4]
[1,] 0.20 0.00 0.00 0.80
[2,] 0.25 0.25 0.25 0.25
[3,] 0.25 0.25 0.25 0.25
[4,] 1.00 0.00 0.00 0.00
[5,] 0.20 0.00 0.00 0.80
[6,] 0.25 0.25 0.25 0.25
[7,] 0.25 0.25 0.25 0.25
[8,] 1.00 0.00 0.00 0.00
[9,] 0.20 0.00 0.00 0.80
[10,] 0.25 0.25 0.25 0.25
[11,] 0.25 0.25 0.25 0.25
[12,] 1.00 0.00 0.00 0.00
[13,] 0.20 0.00 0.00 0.80
[14,] 0.25 0.25 0.25 0.25
[15,] 0.25 0.25 0.25 0.25
[16,] 1.00 0.00 0.00 0.00
Desired
[A] [C] [G] [T]
[AA] 0.20 0.00 0.00 0.80
[AC] 0.25 0.25 0.25 0.25
[AG] 0.25 0.25 0.25 0.25
[AT] 1.00 0.00 0.00 0.00
[CA] 0.20 0.00 0.00 0.80
[CC] 0.25 0.25 0.25 0.25
[CG] 0.25 0.25 0.25 0.25
[CT] 1.00 0.00 0.00 0.00
[GA] 0.20 0.00 0.00 0.80
[GC] 0.25 0.25 0.25 0.25
[GG] 0.25 0.25 0.25 0.25
[GT] 1.00 0.00 0.00 0.00
[TA] 0.20 0.00 0.00 0.80
[TC] 0.25 0.25 0.25 0.25
[TG] 0.25 0.25 0.25 0.25
[TT] 1.00 0.00 0.00 0.00
3 Réponses :
La note ci-dessus est instructive. Les Dim Names sont une liste avec le même nombre d'éléments que les dimensions de l'ensemble de données, où chaque élément correspond aux éléments numériques le long de cette dimension, c'est-à-dire la liste Pour définir cela en C, je recommanderais: p> Vous devrez ensuite définir les éléments de rive et de colname concernés. En général, ce produit est beaucoup em> plus facile à faire dans R. P> JIM P> P> (C ('A', 'c', "g", 'T'), C ('A', 'C', 'G', 'T'))) Code>.
Vous devez définir les éléments de dimnales code> avant d'appeler setattrib code>. @Nick: Je recommanderais également de faire cela dans R.
Jim, il n'aurait pas besoin d'être non protégé (4) aussi. Je l'ai essayé et ça ne semblait pas marcher. Je vais continuer à essayer cependant
Vous auriez également besoin d'au moins les éléments suivants, mais cela ne fonctionne toujours pas ... set_string_elt (rownames, 0, mkchar ("a")); Set_vector_elt (Dim Noms, 0, Remises de Remises); Set_vector_elt (Dim Noms, 1, Colnames);
Comme Jim dit, c'est beaucoup plus facile à faire dans R. Je transmet que les noms dans la fonction C via l'argument nam code>. R CMD SHLIB myMat.c
Rscript -e 'dyn.load("myMat.so"); .Call("myMat", c("A","C","G","T"))'
Hmm, eh bien, le problème consiste à obtenir les chaînes dans les objets SEXP. Protéger (colnames = allocvecteur (Vecsxp, 4)); Protéger (A = NEW_CARACTER (1)); Set_string_elt (a, 0, mkchar ("a")); Set_vector_elt (rownames, 0, a); Set_vector_elt (rownames, 1, a); Set_vector_elt (rownames, 2, a); Set_vector_elt (rownames, 3, a);
Voulez-vous dire «changer» mymat.so "à" mymat.dll "? Pour le moment, la façon dont il se lit semble comme si vous vous référez à mymat.c code> comme la chose à changer sur mymat.dll code>.
Si vous êtes ouvert à C ++ au lieu de C, alors RCPP peut faire cela peu plus facile. Nous venons de créer un objet de liste avec des lignes et des noms de colonne comme nous le ferions dans R, et attribuez-le à l'attribut DimNames Code> de l'objet Matrix: R> src <- '
+ Rcpp::NumericMatrix x(2,2);
+ x.fill(42); // or more interesting values
+ Rcpp::List dimnms = // two vec. with static names
+ Rcpp::List::create(Rcpp::CharacterVector::create("cc", "dd"),
+ Rcpp::CharacterVector::create("ee", "ff"));
+ // and assign it
+ x.attr("dimnames") = dimnms;
+ return(x);
+ '
R> fun <- cxxfunction(signature(), body=src, plugin="Rcpp")
R> fun()
ee ff
cc 42 42
dd 42 42
R>
Merci pour la suggestion, mais malheureusement, je suis limité à C.
Pas vraiment parce que chaque installation R qui a C via GCC a également C ++ via g ++ et le code d'objet interoperate.
Y a-t-il .attr ("rownames") code>, .attr ("colnames") code>, .attr ("noms") code> aussi, dans Case on veut seulement spécifier des noms de colonne ou de lignes? Où trouverez-vous ces informations dans les docs?
Oui, comme vous pouvez le constater, dites, les sources R ou les sources de packages définissant ces choses.
Dim Names nomme chaque rangée et colonne, qu'un coup d'œil curseur à? Dim Names affichera Dim Names (Tapis) <- liste (C ("A", "C", "G", "T"), C ("A", "C", "G", "T")) Il y a aussi? Rownames et? Colnames