r - 如何使用 rapply 将其中带有标量的列表替换为带有标量的列表和一个或多个列表?
问题描述
我有两个列表R
,D
我想将它们组合起来生成 list P
。最终列表的元素是独一无二的。但是,如果 的头部D
和列表中的字符元素匹配R
,我想用 替换list("C")
, list("C", list("D", list("E"))
。这个例子有点太简单了,因为在我的问题中可能有更深的嵌套。所以,我想我想要一个使用类似rapply
.
P = list("A", list("B"), list("C", list("D"), list("E"))
R = list("A", list("B"), list("C"))
D = list(list("C", list("D"), list("E")))
for(d in D) {
p = d[[1]]
R <- rapply(R, function(x) if(identical(x, p)) {
d
} else {
x
}, how = "list")
}
R
不幸的是,这并不完全正确,因为它将 R 变异为类似的东西P
,但是在 C 周围有一个“残留”列表作为附加层(这是一个仅包含一个列表的列表)。有没有办法避免这种情况,或者有必要编写一个递归函数来在事后进行清理,就像我尝试使用trim
下面的过程一样?
is_vestige = function(x) {
length(x) == 1 && all(vapply(x, is.list, TRUE))
}
trim = function(x) {
n = length(x)
if(n == 0) {
return(NULL)
}
if(n == 1) {
if(is_vestige(x)) {
return(trim(x[[1]]))
} else {
return(x)
}
} else {
return(Map(trim, x))
}
}
解决方案
推荐阅读
- vbscript - 无法从 vbscript 更新测试集中的测试人员名称
- android - com.google.android.gms.ads 的 NullPointerException
- google-cloud-platform - 我想识别Terraform的执行环境的公网IP并添加到防火墙规则中
- machine-learning - 一种更不平衡的compute_class_weight方法
- c# - 如何访问在 Azure AKS 上配置的 RabbitMQ 集群以在队列上发送消息?
- stata - 使用 for 循环删除递归回归中的实体
- c# - 如何定位(世界空间)画布文本以在 Unity 中创建尺寸叠加
- angular - 在角度服务中初始化时,array.some 在运行 ng-test 期间不是函数
- python - Kivy 和 PyUpdater 日志之间的冲突
- opencv - OpenCV 平均划分边缘并占据主导地位