2016-07-04 2 views
-1

J'ai une liste sage de liste de liste qui est le résultat de certaines fonctions appliquées sur une liste R de liste de liste (convertie au format sage)Convert Sage Liste de liste de liste à R liste de liste de liste

Le code va comme ceci:

%r 
my_r_list<-load("my_r_list.RData") 

for d in range(D): 
    for s in range(S): 
     for c in range(C): 
      my_sage_list[d][s][c] = ("my_r_list")[[d+1]][[s+1]][[c+1]]._sage_() 
      output_my_sage_list[d][s][c] = some_function(my_sage_list[d][s][c]) 

Je voudrais convertir output_my_sage_list nouveau dans une liste de R pour enregistrer dans un fichier .RData

Documentation sur l'interface Sage avec R est principalement d'aller de R à Sage mais pas l'inverse ré. This question concerne la conversion d'une matrice sagemath en matrice R en utilisant r.matrix()' so i tried using 'r.list()' but with no luck. I also tried the simple output_my_r_list = r (output_my_sage_list) which gives no error but the output is not correct as doing output_my_r_list [0] [0] `ne donne pas le dernier niveau de liste mais directement certaines valeurs.

Un code reproductible (sans passer par le R à la partie Sage) serait:

output_d = [[] for _ in range(9)] 
    for d in range(9): 
     output_s = [[] for _ in range(4)] 
     output_d[d] = output_s 
     for s in range(4): 
      output_c = [[] for _ in range(2)] 
      output_s[s] = output_c 
      for k in range(2): 
       res = random() 
       output_c[k] = res 

Je voudrais convertir output_d à une liste de R

Répondre

0

La clé est ici votre déclaration

J'ai aussi essayé le output_my_r_list = r(output_my_sage_list) simple qui ne donne pas d'erreur mais la sortie n'est pas correcte car faire output_my_r_list[0][0] ne donne pas le dernier niveau de liste mais directement quelques val ues.

Sage en fait des documents qu'il fera la liste juste une liste concaténée, ou plus d'un R vecteur:

sage: x = r([10.4,5.6,3.1,6.4,21.7]); x 
    [1] 10.4 5.6 3.1 6.4 21.7 

The following assignment creates a vector $y$ with 11 entries which 
consists of two copies of $x$ with a 0 in between:: 

    sage: y = r([x,0,x]); y 
    [1] 10.4 5.6 3.1 6.4 21.7 0.0 10.4 5.6 3.1 6.4 21.7 

Ceci est directement modeled upon R usage, et probablement (via une procédure de nidification) même tout vient de lui:

The further assignment 

> y <- c(x, 0, x) 

would create a vector y with 11 entries consisting of two copies of 
with a zero in the middle place. 

donc, votre boeuf est pas exactement avec Sage, mais R, comme (en quelque sorte) Sage obtient la chose « bonne » ici. Sage fait cela parce que here il dit

def _left_list_delim(self): 
    return "c(" 

et le comportement de R suit comme cela se fait de manière récursive et il est un vecteur de vecteurs.

Un hack autour de ce serait d'y retourner "list(". Un autre hack serait d'essayer d'utiliser r.eval("list(something)") mais je n'ai pas eu beaucoup de succès avec ça.

Il serait bon de trouver un moyen de faire face à cela plus facilement, bien sûr, et dans le sens de retour Sage attempts to take nested R stuff and keep it nested (avec quel succès, je ne sais pas).