2016-07-04 5 views
-1

У меня есть список из списка sage, который является результатом некоторой функции, применяемой в списке R списка (преобразованный в формат sage)Convert Sage Список списка списка R список списка

код выглядит следующим образом:

%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]) 

Я хотел бы преобразовать output_my_sage_list обратно в список R таким образом, чтобы сохранить его в .RData файл

Документация по интерфейсу Sage с R в основном о переходе от R to Sage, но не наоборот д. This question относится к преобразованию матрицы sagemath в матрицу R с использованием 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] `не дает последний уровень списка, а непосредственно некоторые значения.

Воспроизводимая код (в обход R в Sage части) будет:

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 

Я хотел бы преобразовать output_d в список R

ответ

0

Ключевым моментом здесь является ваше заявление

Я также пробовал простой output_my_r_list = r(output_my_sage_list), который не дает никаких ошибок, но вывод не является правильным, так как output_my_r_list[0][0] не дает последний уровень списка, но напрямую некоторый val ЕЭС.

Sage фактически документы, которые он сделает список только один каскадный список, или более правильно R вектор:

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 

Это непосредственно modeled upon R usage, и, предположительно, (с помощью какой-то вложенности процедуры), даже просто приходит от него:

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. 

так что ваша говядина точно не с Sage, но R, так как (то) Sage получает «право» вещь здесь. Sage делает это потому, что он говорит here

def _left_list_delim(self): 
    return "c(" 

, а затем поведение R следует, как это делается рекурсивно, и это делает вектор векторов.

Взлом вокруг этого было бы вернуть "list(". Другим взломом было бы попытаться использовать r.eval("list(something)"), но я не испытал большого успеха с этим.

Было бы неплохо найти способ справиться с этим более легко, конечно, и в обратном направлении Sage attempts to take nested R stuff and keep it nested (с каким успехом я не знаю).

Смежные вопросы