在R

时间:2018-12-02 01:11:57

标签: 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个元素的列表。由于每次输出的长度都是相同的,而我只是添加到列表中,为什么它抱怨长度不匹配或替换呢?

2 个答案:

答案 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?
使用[[意味着您确定只使用了一个插槽,并且不会意外覆盖任何内容。