предотвращение преобразования вложенного списка R в именованный вектор

Я хочу создать вложенный список, например,

> L <- NULL
> L$a$b <- 1
> L
$a
$a$b
[1] 1

Так как мне нужно делать присваивание в циклах, я должен использовать скобки вместо доллара, например,

> L <- NULL
> a <- "a"
> b <- "b"
> L[[a]][[b]] <- 1
> L
a 
1
> b <- "b1"
> L[[a]][[b]] <- 1
Error in L[[a]][[b]] <- 1 : 
  more elements supplied than there are to replace

Это выходит за рамки моих ожиданий: L становится именованным вектором, а не вложенным списком. Однако, если присвоенное значение является вектором, длина которого превышает 1, проблема исчезнет,

> L <- NULL
> L[[a]][[b]] <- 1:2
> L
$a
$a$b
[1] 1 2
> b <- "b1"
> L[[a]][[b]] <- 1
> L
$a
$a$b
[1] 1 2

$a$b1
[1] 1

Большинство моих заданий длиннее 1, поэтому мой код, казалось бы, работал, но временами странным образом давал сбои. Я хочу знать, есть ли способ исправить это неожиданное поведение, спасибо.


person foehn    schedule 25.08.2013    source источник
comment
Похоже на ошибку или, по крайней мере, что-то странное в функциях присваивания. Обратите внимание на разницу между ними: L <- list(); L$a$b <- 1; is(L$a) и M <- list(); M[["a"]][["b"]] <- 1; is(M$a).   -  person Ferdinand.kraft    schedule 25.08.2013
comment
Самое удивительное, что после установки L[[a]][[b]] <- 1 получение L[[a]][[b]] выдаст ошибку.   -  person flodel    schedule 25.08.2013
comment
@flodel, ты используешь a или "a"? Я не получаю ошибок при использовании строк.   -  person Ferdinand.kraft    schedule 26.08.2013


Ответы (2)


Вы можете явно сказать, что каждая вещь должна быть своим собственным списком

> L <- list()
> L[[a]] <- list()
> L[[a]][[b]] <- 1
> L
$a
$a$b
[1] 1

Но похоже, что есть лучший способ сделать то, что вы хотите, если вы объясните свою настоящую цель.

person Dason    schedule 25.08.2013
comment
на самом деле я хотел бы сохранить результаты (векторы символов переменной длины) моего анализа. Для анализа у меня есть несколько шагов, скажем, шаг a и b, и для каждого шага я использовал разные методы, скажем, a1, a2... и b1, b2... Наконец, я хочу сохранить их во вложенном списке. Использование такой структуры списка облегчает последующий анализ, форматирование и циклическое сохранение, а также делает мое рабочее пространство более компактным и аккуратным. Спасибо. - person foehn; 26.08.2013
comment
Если есть ответ, который лучше всего подходит для вас, не стесняйтесь щелкать галочкой рядом с этим ответом, чтобы показать, что этот ответ помог вам больше всего. - person Dason; 26.08.2013

смотри справку("[[")

Когда $‹- применяется к NULL x, он сначала приводит x к list(). То же самое происходит с [[‹-, если значение замещающего значения имеет длину больше единицы: если значение имеет длину 1 или 0, x сначала приводится к вектору нулевой длины типа значения.

person Wojciech Sobala    schedule 25.08.2013
comment
Что объясняет, что происходит, но не как это исправить - person Dason; 26.08.2013
comment
@Sobala, ах, я вижу, извините, не взглянул на помощь. Спасибо. - person foehn; 26.08.2013