簡體   English   中英

R:遞歸地遍歷並行的粗糙列表?

[英]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

  1. 遞歸合並列表,優先選擇partial_customization

  2. 使用示例的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM