繁体   English   中英

在R中的循环中创建嵌套列表

[英]Creating nested lists in a loop in R

这段代码可以实现我想要的功能,但是会在每次循环迭代时生成警告:

library(epiR)
    cccList <- list()
    for (i in 3:ncol(dfData)){
      tmpvar <- paste("cccIntactVs.", i, sep = "")
      assign(
        tmpvar, 
        epi.ccc(
          dfData[2:nrow(dfData),2], 
          dfData[2:nrow(dfData),i], 
          ci = "z-transform", 
          conf.level = 0.95, 
          rep.measure = FALSE
        )
      )
      cccList[i] <- get(paste0("cccIntactVs.", i))
    }

每当epi.ccc()的输出添加到cccList()时,我都会收到此警告:

Warning in cccList[i] <- get(paste0("cccIntactVs.", i)) :
  number of items to replace is not a multiple of replacement length

有没有更合适的方法可以做到这一点? epi.ccc()的输出是7个元素的列表。 由于每次输出的长度都是相同的,而我只是添加到列表中,为什么它抱怨长度不匹配或替换呢?

如果get(paste0("cccIntactVs.", i))的长度不为1 get(paste0("cccIntactVs.", i))cccList[i] <- get(paste0("cccIntactVs.", i))将触发此警告。

使用get(paste0("cccIntactVs.", i))[1]应该可以解决它,但如果您不希望get(paste0("cccIntactVs.", i))的长度get(paste0("cccIntactVs.", i)) 1,则可能会出错尽管结果现在看起来对您来说还不错,但是您在代码中的其他位置。

您要使用[[i]]而不是[i]

基本上, [表示您想要用不同的内容替换列表的某个部分 ,并且替换项所需要的项数与您要替换的插槽数一样多。
OTOH,使用[[表示您想将要分配的所有内容放入一个插槽,这似乎是您想要的。 发生的情况的一个示例:

myList <- list(1,2,3,4,5,6,7)
myList[3:5] <- c(11, 12, 13)
myList[[6]] <- c(14, 15, 16)

此处,11-13在插槽3到5之间分配:3个插槽中的3个替换项。 14-16放在一个插槽中:此插槽现在包含一个长度为3的向量。
现在,如果我们尝试这样做会怎样?

myList[1] <- c(17,18,19)

我们告诉R应该在一个插槽上分配3个物品。 它会尽力而为,这并不多:它丢弃除第一项以外的所有内容。 但幸运的是,它会警告您。 如果您确实只想分配第一项,则可以使用

myList[1] <- c(17,18,19)[1]

但这并不是真正有用,提供18和19没有用。您可以将其列出长度为1的列表:

myList[1] <- list(c(17,18,19))

但通常,如果要将其放在一个插槽中,则使用[[是可行的方法。

另外,为什么要这样构建?
原因是[可以让您访问多个插槽,而您可能事先不知道是哪个插槽。 如果我尝试该怎么办?

someVar <- readLines(somefile) # someVar happens to be c(1, 2) instead of having length 1
myList[someVar] <- 21:23

在两个插槽中都放21:23吗? 将21放入第一个插槽,将其余的(22,23)放入插槽2?
使用[[表示您确定只使用了一个插槽,并且不会意外覆盖任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM