编辑:这个问题很傻,我把[和[[ (谢谢@josilber),但我不能删除它。
如何在R中生成一个无限递归的列表,L == L1?
一种糟糕的方法(对于R新手来说)是在astsa包中查看dataset fmri
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 )发布于 2015-06-04 23:08:53
“如何在R中创建一个无限递归列表L == L1”的答案是这是不可能的,因为你需要无限数量的内存来存储一个无限递归深度的列表。
也就是说,您可以使用一个简单的for循环构建一个指定深度的递归列表,在每次迭代中创建一个新列表,该列表将旧列表存储为其元素之一:
l <- list()
depth <- 50
for (k in seq(depth-1)) {
l <- list(l)
}您可以编写一个递归函数来检查递归列表的深度:
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]子集列表(也就是它只返回第一个元素的列表)。例如,考虑以下非常简单的列表:
(l <- list(2))
# [[1]]
# [1] 2无论我多少次使用[符号进行子集,我都会得到完全相同的列表:
l[1]
# [[1]]
# [1] 2
l[1][1]
# [[1]]
# [1] 2通过print_recursive函数运行此列表l也将导致无限循环。如果您希望实际提取列表的第一个元素,而不是设置列表本身的子集,则应该使用[[表示法(例如l[[1]])。
https://stackoverflow.com/questions/30647427
复制相似问题