Создание вложенных списков в цикле в R - PullRequest
0 голосов
/ 02 декабря 2018

Этот бит кода делает то, что я хочу, но генерирует предупреждение для каждой итерации цикла:

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 голосов
/ 02 декабря 2018

Вы хотите использовать [[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?
Использование [[ означает, что вы уверены, что используется только один слот, и вы ничего неожиданно не перезаписываете.

0 голосов
/ 02 декабря 2018

cccList[i] <- get(paste0("cccIntactVs.", i)) вызовет это предупреждение, если get(paste0("cccIntactVs.", i)) не имеет длины 1.

Использование get(paste0("cccIntactVs.", i))[1] должно решить эту проблему, но если вы не ожидали, что get(paste0("cccIntactVs.", i)) будет иметь длину, превышающую 1вы, вероятно, ошиблись где-то еще в вашем коде, несмотря на то, что результат выглядит для вас нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...