【问题标题】:Storing a value in a nested list with an unknown depth in R将值存储在R中深度未知的嵌套列表中
【发布时间】:2016-12-15 18:50:56
【问题描述】:

我正在尝试优化计算密集型的代码,因为它处理 80 个元素集的子集。

我想要加速的一个关键步骤是确定我的循环中的当前子集是否已经被处理。目前,我检查该子集是否包含在已处理的相同大小 k(基数)的子集中。将逐步处理的子集存储在嵌套列表中以检查子集是否已被处理(O(1) 而不是 O(80 选择 k) 中的搜索)会更快。

我编写一个函数来检查当前子集是否在我的已处理子集的嵌套列表中没有问题:access(treated, subset=c(2,5,3)) 返回 TRUE 如果 treated[[2]][[5]][[3]]==TRUE

但是,我不知道如何(在我的循环中)将我当前的子集存储在处理列表中。我希望这样的事情成为可能:treated[h] <- TRUE 其中 h 是我当前的子集(在上面的示例中:h=c(2,5,3)

我面临的主要问题是“[[..]]”的数量在我的循环中有所不同。除了完成 h 以使其长度为 80 并放入 80 个“[[..]]”的序列之外,我还有其他选择吗,例如:treated[[h[1]]][[h[2]]]...[[h[80]]] <- TRUE

【问题讨论】:

    标签: r list nested


    【解决方案1】:

    如果 h 是值的向量,则

    "[["(treated, h)
    

    递归地对列表项进行子集化。 例如,我创建了一个(不那么高的)嵌套列表:

    > a
    [[1]]
    [[1]][[1]]
    [1] 2
    
    [[1]][[2]]
    [[1]][[2]][[1]]
    [1] 3
    
    [[2]]
    [1] 1
    

    以下命令,正确地递归地将项目子集应用于列表:

    > "[["(a, c(1,2,1))
    [1] 3
    

    递归子集向量的长度可以在不固定 [[..]] 数量的情况下变化。例如,使用相同的语法对两个深度级别进行子集化:

    > "[["(a, c(1,2))
    [[1]]
    [1] 3
    

    【讨论】:

    • 太棒了!我不知道这个命令。它是适用于其他事物的更通用语法的一部分吗?
    • 顺便说一句,您的解决方案(仅)适用于我的情况,因为我从来没有在没有先输入元素 (i,j) 的情况下在处理过的嵌套列表中输入元素 (i,j,k)。跨度>
    • LISP 是影响 R 结构的语言之一(实际上我不是 LISPER)。在 LISP 中,所有运算符实际上都是函数。在 R 中也是如此:每个运算符都是一个函数调用。
    • 因此,您甚至可以通过引用它们并将操作数作为参数提供操作数(如“+”(3, 5))来使用算术运算符作为函数调用
    • 这样,操作符可以在*ply类型函数中使用(包括像“[”和“[[”这样的子集操作符)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多