创建一个命名列表元素,如果它在 R 中不存在

create a named list element, if it doesnt exist already in R

我有一个列表 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 <- "01-response"。如果我要添加第三个列表 contentList3 <- 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 <- "01-response"

我认为你可以在不知道 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

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

回答您的问题之一:

How can i check if "content" exists at the level of masterList[[listElement]]?

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