将列表列表的列表转换为列表列表的R列表

时间:2016-07-04 15:32:00

标签: r list sage rdata

我有一个列表列表的sage列表,它是在列表列表的R列表上应用的某些函数的结果(转换为sage格式)

代码如下:

%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到Sage但不是相反。This question关注使用r.matrix()' so i tried using 'r.list()' but with no luck. I also tried the simple将sagemath矩阵转换为R矩阵output_my_r_list = r(output_my_sage_list){ {1}} output_my_r_list [0] [0]`不提供最后一级列表但直接给出一些值。

可重现的代码(绕过R到Sage部分)将是:

which gives no error but the output is not correct as doing

我想将 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 转换为R列表

1 个答案:

答案 0 :(得分:0)

这里的关键是你的陈述

  

我还尝试了简单的output_my_r_list = r(output_my_sage_list),它没有给出任何错误,但是输出不正确,因为执行output_my_r_list[0][0]不会给出最后一级列表,而是直接给出一些值。

Sage实际上记录了它会使列表只是一个连接列表,或者更恰当地是R vector

    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找到一种更轻松地处理这个问题的方法会很高兴(我不知道会取得什么成功)。