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