Ответ 1
Это происходит потому, что вы назначаете вектор длины 1 NULL-атомному вектору.
От help(Extract)
-
Когда
$<-
применяется к NULLx
, он сначала принуждаетx
кlist()
. Это также происходит с[[<-
, если значение заменыvalue
имеет длину больше единицы: еслиvalue
имеет длину 1 или 0,x
сначала принудительно привязывается к вектору нулевой длины типаvalue
.
Измените назначение на ... <- 1:2
(или что-то другое, чем длина 0 или 1 вектор), и вы получите тот же результат в обоих блоках кода.
list1 <- list()
lev1 <- "level1"
lev2 <- "level2"
list1[[lev1]][[lev2]] <- 1:2
list1
# $level1
# $level1$level2
# [1] 1 2
list2 <- list()
list2$level1$level2 <- 1:2
list2
# $level1
# $level1$level2
# [1] 1 2
Более простой пример этого, как уже упоминалось в комментариях @alexis_laz, заключается в том, чтобы начать с NULL атомного вектора и посмотреть, что происходит.
x <- NULL
## assign a length 1 vector --> atomic result
x[["lev1"]] <- 1
x
# lev1
# 1
y <- NULL
## assign a length > 1 vector --> list result
y[["lev1"]] <- 1:2
y
# $lev1
# [1] 1 2
Результат из $<-
всегда является списком, поэтому я опустил его здесь.