[英]R: recursively iterating through parallel ragged lists?
我以列表的形式定義了一個復雜的參數層次結構,該列表提供了具有定義進一步特征的屬性的默認值(在示例中, match.args
使用的several.ok
)。 現在,我正在尋找一種方法,將該列表與提供自定義功能的部分副本合並,並檢查結果是否符合屬性編碼的參數。 如何做到這一點使我難以為繼(幾個小時)。
考慮以下:
defaults_list <- list(
a = structure('a', several.ok = TRUE),
b = list(
b1 = structure('b1', several.ok = TRUE),
b2 = structure('b2', several.ok = FALSE)))
partial_customization <- list(
b = list(
b2 = 'custom_b2'))
我正在尋找的是可以實現的black_magic
:
遞歸合並列表,優先選擇partial_customization
和
使用示例的several.ok
bool測試所有結果元素( FALSE
的長度必須為1-在“現實生活”中,我還有一個class
字段可進行檢查, several.ok
)
我從上面尋找的結果是:
result_list <- list(
a = 'a',
b = list(
b1 = 'b1',
b2 = 'custom_b2')
在這種情況下
partial_customization <- list(
b = list(
b2 = c('custom_b2.1', 'custom_b2.2')))
錯誤應甩作為several.ok
的屬性b2
不允許 length > 1
。
如何有效地做到這一點?
通常,解決方案實際上位於R
工具的核心集中…… utils::modifyList
確實(幾乎)完成了我要尋找的(關於合並列表)。
由於原始函數剝離了屬性,因此我對其進行了如下修改:
modifyList_with_attributes <- function (x, val, keep.null = FALSE, maintain.x.attributes = TRUE)
{
stopifnot(is.list(x), is.list(val))
xnames <- names(x)
vnames <- names(val)
vnames <- vnames[nzchar(vnames)]
if (keep.null) {
for (v in vnames) {
saved_attributes <- attributes(x[[v]])
x[v] <- if (v %in% xnames && is.list(x[[v]]) && is.list(val[[v]]))
list(modifyList_with_attributes(x[[v]], val[[v]], keep.null = keep.null, maintain.x.attributes = maintain.x.attributes))
else val[v]
if(maintain.x.attributes)
{
attributes(x[[v]]) <- saved_attributes
}
}
}
else {
for (v in vnames) {
saved_attributes <- attributes(x[[v]])
x[[v]] <- if (v %in% xnames && is.list(x[[v]]) &&
is.list(val[[v]]))
modifyList_with_attributes(x[[v]], val[[v]], keep.null = keep.null, maintain.x.attributes = maintain.x.attributes)
else val[[v]]
if(maintain.x.attributes)
{
attributes(x[[v]]) <- saved_attributes
}
}
}
x
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.