将 Sage List of list of list 转换为 R list of list of list

Convert Sage List of list of list to R list of list of list

我有一个 sage list of list of list,它是对 list of list 的 R list 应用某些函数的结果(转换为 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 simpleoutput_my_r_list 将 sagemath 矩阵转换为 R 矩阵= r(output_my_sage_list)which gives no error but the output is not correct as doingoutput_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 列表

这里的关键是你的陈述

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] doesn't give the last level of list but directly some values.

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 在这里得到了 'right' 东西。 Sage 这样做是因为 here 它说

def _left_list_delim(self):
    return "c("

然后 R 行为如下,因为这是递归完成的,它构成了向量的向量。

解决这个问题的方法是 return "list(" 那里。另一个 hack 是尝试使用 r.eval("list(something)") 但我并没有成功。

当然,如果能找到一种更容易处理这个问题的方法,并且在 Sage attempts to take nested R stuff and keep it nested 的 return 方向(成功率如何,我不知道),那就太好了。