如果R中不存在命名列表元素,则创建该元素



我有一个列表masterList,我想向它附加另一个列表:contentListcontentList2。内容列表是属于";01响应"-CCD_ 4。

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"]]。然而,我希望所有内容都存储在master列表中的命名列表中:`masterList[["01响应"]][["内容"]],如:

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响应"]][["内容"]]是否存在。如果它存在,我只需附加。如果它不存在,我需要先创建它。

用于将元素指定为变量,例如: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

这样做的诀窍是,如果xNULL,则c(x, y)创建;如果x是预先存在的列表,则将附加

回答您的一个问题:

如何检查是否"内容";是否存在于masterList[[listElement]]级别

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

最新更新