首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中创建一个无限递归列表: confuse [ and [[

如何在R中创建一个无限递归列表: confuse [ and [[
EN

Stack Overflow用户
提问于 2015-06-04 23:01:44
回答 1查看 57关注 0票数 0

编辑:这个问题很傻,我把[和[[ (谢谢@josilber),但我不能删除它。

如何在R中生成一个无限递归的列表,L == L1?

一种糟糕的方法(对于R新手来说)是在astsa包中查看dataset fmri

代码语言:javascript
复制
data( fmri, package="astsa" )  # a list with fmri[1] == fmri[1][1] ... ??

print_recursive = function( x ){  # x x[1] x[1][1] ... while list
    for( j in 1:5 ){
        cat( class(x), len(x), names(x), "\n" )
        str(x)
        cat( "\n" )

        x = x[1]  # <-- wrong, should be x[[1]]
        if( class(x) != "list" )  break
    }
    x
}

x = print_recursive( fmri )
EN

回答 1

Stack Overflow用户

发布于 2015-06-04 23:08:53

“如何在R中创建一个无限递归列表L == L1”的答案是这是不可能的,因为你需要无限数量的内存来存储一个无限递归深度的列表。

也就是说,您可以使用一个简单的for循环构建一个指定深度的递归列表,在每次迭代中创建一个新列表,该列表将旧列表存储为其元素之一:

代码语言:javascript
复制
l <- list()
depth <- 50
for (k in seq(depth-1)) {
  l <- list(l)
}

您可以编写一个递归函数来检查递归列表的深度:

代码语言:javascript
复制
recursive.depth <- function(l) {
  if (!is.list(l)) 0
  else if (length(l) == 0) 1
  else 1+max(sapply(l, recursive.depth))
}
recursive.depth(l)
# [1] 50
recursive.depth(fmri)
# [1] 1

回到问题中的示例,您所拥有的列表实际上根本不是递归的(它只是一个矩阵列表)。您认为它是递归的原因是索引l[1]子集列表(也就是它只返回第一个元素的列表)。例如,考虑以下非常简单的列表:

代码语言:javascript
复制
(l <- list(2))
# [[1]]
# [1] 2

无论我多少次使用[符号进行子集,我都会得到完全相同的列表:

代码语言:javascript
复制
l[1]
# [[1]]
# [1] 2
l[1][1]
# [[1]]
# [1] 2

通过print_recursive函数运行此列表l也将导致无限循环。如果您希望实际提取列表的第一个元素,而不是设置列表本身的子集,则应该使用[[表示法(例如l[[1]])。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30647427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档