r - 如何以干净的方式在深层嵌套列表上应用函数?
问题描述
在像这样的嵌套列表中
l <- list(list(list(111, 112, 113), list(121, 122, 123)),
list(list(211, 212, 213), list(221, 222, 223)))
> str(l )
List of 2
$ :List of 2
..$ :List of 3
.. ..$ : num 111
.. ..$ : num 112
.. ..$ : num 113
..$ :List of 3
.. ..$ : num 121
.. ..$ : num 122
.. ..$ : num 123
$ :List of 2
..$ :List of 3
.. ..$ : num 211
.. ..$ : num 212
.. ..$ : num 213
..$ :List of 3
.. ..$ : num 221
.. ..$ : num 222
.. ..$ : num 223
我们可以应用一个函数,例如length()
在第一层通过这个
lapply(l, length)
但是当在更深的嵌套级别上应用函数时,我的代码大小会呈指数级增长......
# apply length() on second level
lapply(l, function(x)
lapply(x, function(y) length(y)))
# square every list element of second level
lapply(l, function(x)
lapply(x, function(y)
lapply(y, function(z) z^2)))
或者,要更改出现在较低级别列表中某些位置的元素(即 LHS 的修改),我没有比执行 for 循环更好的主意了。
# subtract 1 from first element of each second level list
for(i in sequence(length(l))) {
l[[i]][[1]][[1]] <- l[[i]][[1]][[1]] - 1
l[[i]][[2]][[1]] <- l[[i]][[2]][[1]] - 1
}
我错过了什么吗?有没有更清洁的基础 R解决方案?
解决方案
根据我的经验,列表并不容易掌握(希望有一天能达到)。我不知道灵丹妙药,但这里有一些可以简化当前代码的边际步骤:
lengths(l)
# instead of
lapply(l, length)
lapply(l, lengths)
# instead of
lapply(l, function(x)
lapply(x, function(y) length(y)))
rapply(l, function(x) x^2, how="list") # credit to Cath
# instead of
lapply(l, function(x)
lapply(x, function(y)
lapply(y, function(z) z^2)))
for (i in seq_along(l)) {
l[[i]] <- lapply(l[[i]], function(x) {x[[1]] <- x[[1]] - 1; x})
}
# Instead of
for(i in sequence(length(l))) {
l[[i]][[1]][[1]] <- l[[i]][[1]][[1]] - 1
l[[i]][[2]][[1]] <- l[[i]][[2]][[1]] - 1
}
推荐阅读
- python - Python ftplib 可以在特定时间保持 FTP 下载吗?
- javascript - 在组件中使用 getStaticProps
- python - Dataflow Flex 模板验证失败,没有给出任何理由
- c - CS50 Speller:valgrind 测试说字节仍然可以在 3 个块中到达
- android - Retrofit2:java.io.EOFException:第 1 行第 1 列路径 $ 输入结束
- swift - 在 iOS 15 上启动应用程序时观察“应用程序需要更新”消息
- javascript - 如何删除Firefox扩展中的存储值?
- database - Neo4j - Java 堆空间 java.lang.OutOfMemoryError: Java 堆空间
- regex - 如何将多个数字序列捕获为重复组?
- django - 使用下载按钮在 django 管理面板中下载模型数据