【问题标题】:create a named list element, if it doesnt exist already in R创建一个命名列表元素,如果它在 R 中不存在
【发布时间】:2021-04-17 16:43:38
【问题描述】:

我有一个列表masterList,我想在其中添加另一个列表:contentListcontentList2。内容列表是属于“01-response”的结果 - masterList 的第一个元素。

masterList <- list("01-response" = NULL, "02-response" = NULL,"03-response" = NULL,"04-response" = NULL,"05-response" = NULL)
contentList <- list(item1 = "text", item2 = "text2")
contentList2 <- list(item1 = "moretext", item2 = "moretext2")

我想将contentListcontentList2 附加到masterList[["01-response"]]。但是,我希望将所有内容存储在 masterList 内的命名列表中:`masterList[["01-response"]][["contents"]],例如:

masterList
$`01-response`
$`01-response`$content
$`01-response`$content$item1
[1] "text"

$`01-response`$content$item2
[1] "text2"

$`01-response`$content$item1
[1] "moretext"

$`01-response`$content$item2
[1] "moretext2"



$`02-response`
NULL

$`03-response`
NULL

$`04-response`
NULL

$`05-response`
NULL 

问题在于附加。在我追加之前,我需要检查 `masterList[["01-response"]][["contents"]] 是否存在。如果它存在,我只是追加。如果它不存在,我需要先创建它。

让我们将元素指定为变量,例如:listElement &lt;- "01-response"。如果我要添加第三个列表contentList3 &lt;- list(item1 = "moretext3", item2 = "moretext4"),我会简单地运行:

`listElement <- "01-response"`
    if(exists("content", where = masterList[[listElement]])){
      masterList[[listElement]][["content"]] <- append(masterList[[listElement]][["content"]],
                                                                         contentList3) 
    }else{
      masterList[[listElement]] <- append(masterList[[listElement]],
                                                      list(content = contentList3)) 
    }

但是,如果 masterList 为空,则此代码会中断:

masterList
$`01-response`
NULL

$`02-response`
NULL

$`03-response`
NULL

$`04-response`
NULL

$`05-response`
NULL

exists("content", where = masterList[[listElement]])
Error in as.environment(where) : using 'as.environment(NULL)' is defunct

如何检查“内容”是否存在于masterList[[listElement]] 级别?

注意:这发生在函数内部,因此我想保持灵活性并避免使用masterList[["01-response"]]。我改用masterList[[listElement]],其中listElement &lt;- "01-response"

【问题讨论】:

    标签: r list null append subset


    【解决方案1】:

    我认为你可以在不知道content 是否已经存在的情况下工作。

    masterList[["01-response"]]$content <- c(masterList[["01-response"]]$content, contentList, contentList2)
    str(masterList)
    # List of 5
    #  $ 01-response:List of 1
    #   ..$ content:List of 4
    #   .. ..$ item1: chr "text"
    #   .. ..$ item2: chr "text2"
    #   .. ..$ item1: chr "moretext"
    #   .. ..$ item2: chr "moretext2"
    #  $ 02-response: NULL
    #  $ 03-response: NULL
    #  $ 04-response: NULL
    #  $ 05-response: NULL
    

    这个技巧是c(x, y)创建如果xNULL,并且追加如果x是一个预先存在的列表。

    回答您的一个问题:

    如何检查“内容”是否存在于masterList[[listElement]] 级别?

    "content" %in% names(masterList[["01-response"]])
    

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 1970-01-01
      • 2021-12-30
      • 2013-12-07
      • 2020-02-15
      • 1970-01-01
      • 2016-12-03
      • 2022-07-01
      • 1970-01-01
      相关资源
      最近更新 更多