这段代码可以实现我想要的功能,但是会在每次循环迭代时生成警告:
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个元素的列表。由于每次输出的长度都是相同的,而我只是添加到列表中,为什么它抱怨长度不匹配或替换呢?
答案 0 :(得分:0)
cccList[i] <- get(paste0("cccIntactVs.", i))
的长度不为1, get(paste0("cccIntactVs.", i))
将触发此警告。
使用get(paste0("cccIntactVs.", i))[1]
应该可以解决它,但是如果您不希望get(paste0("cccIntactVs.", i))
的长度超过1,那么即使您现在看起来结果不错,您在代码的其他地方也可能会出错
答案 1 :(得分:0)
您要使用[[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没有用。 您可以将其设为长度为一的列表:
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?
使用[[
意味着您确定只使用了一个插槽,并且不会意外覆盖任何内容。