7
votes

R poste dans C, réglage de la matrice rangées / noms de colonne

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


1 commentaires

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


3 Réponses :


1
votes

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 (C ('A', 'c', "g", 'T'), C ('A', 'C', 'G', 'T'))) .

Pour définir cela en C, je recommanderais: xxx

Vous devrez ensuite définir les éléments de rive et de colname concernés. En général, ce produit est beaucoup plus facile à faire dans R.

JIM


3 commentaires

Vous devez définir les éléments de dimnales avant d'appeler setattrib . @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);



5
votes

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"))'


2 commentaires

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 comme la chose à changer sur mymat.dll .



6
votes

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> 


4 commentaires

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") , .attr ("colnames") , .attr ("noms") 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.