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