Создайте вектор пустых объектов S4

Это может быть тривиально, но я ничего не нашел в Интернете. Можно ли создать вектор пустых объектов S4 в R? Что-то типа:

s4Vec<-rep(emptyS4Object,10)

Спасибо


r s4
person user1701545    schedule 03.05.2013    source источник
comment
Векторы могут содержать только атомарные типы: логические, целочисленные, вещественные, комплексные, строковые или необработанные. Вы имели ввиду список?   -  person David Robinson    schedule 04.05.2013
comment
Большое спасибо за исправление. Теперь, когда я знаю, что вектор не имеет значения, я перефразирую свой вопрос, заменив вектор на список. Итак, можно ли создать список пустых объектов S4 в R?   -  person user1701545    schedule 04.05.2013
comment
@DavidRobinson - Неправда. Списки и объекты выражений также являются типами векторов. (Попробуйте is.vector(list()) и is.vector(expression()) для подтверждения.)   -  person Josh O'Brien    schedule 04.05.2013
comment
replicate() тоже может работать? (не пробовал)   -  person Ben Bolker    schedule 04.05.2013
comment
@BenBolker +1: отлично работает   -  person Beasterfield    schedule 04.05.2013
comment
Векторы @DavidRobinson atomic могут содержать только один тип данных из нескольких основных вариантов. Векторы сами по себе могут содержать любое сочетание данных, которые вы хотите, то есть списки.   -  person Gavin Simpson    schedule 04.05.2013


Ответы (2)


Как это:

s4Vec <- lapply( rep("yourClass", 10), new )

?

person Beasterfield    schedule 03.05.2013
comment
Если какой-либо из ответов решит вашу проблему, было бы неплохо, если бы вы его приняли. - person Beasterfield; 04.05.2013

у меня возникло бы искушение пойти с

.A <- setClass("A", representation(x="integer"))
a <- list(.A())[rep(1, 100)]

который создает один экземпляр (используя удобный генератор, возвращаемый setClass), а затем реплицирует этот объект, как R реплицирует любой другой объект в списке — элементы a на самом деле являются одним и тем же экземпляром, помеченным как готовые к дублированию при изменении; вы можете увидеть это из

> .Internal(inspect(a))
@4e3bc1d8 19 VECSXP g0c2 [NAM(2)] (len=2, tl=0)
  @60b738b8 25 S4SXP g0c0 [OBJ,NAM(2),S4,gp=0x10,ATT] 
  ATTRIB:
[...]
  @60b738b8 25 S4SXP g0c0 [OBJ,NAM(2),S4,gp=0x10,ATT] 

где @4e3bc1d8 — это адрес списка, а @60b738b8 25 S4SXP g0c0 [OBJ,NAM(2),S4,gp=0x10,ATT] отмечают начало описания каждого элемента S4, все фактически в одном и том же месте в памяти @60b738b8 и с так называемым полем NAMED, установленным на 2 NAM(2). Обратите внимание, что изменение одного элемента списка, скорее всего, приведет к копированию всего списка.

Но если каждый из ваших объектов «А» предназначен для представления, скажем, «строки» в традиционной базе данных, тогда вы должны переосмыслить свой дизайн и сделать так, чтобы «А» представлял всю таблицу и слоты. представлять столбцы. Таким образом, вы просто создадите одну букву «А», а не несколько, и заполните ее слоты векторами одинаковой длины. Это будет эффективно использовать память и настроит вас на эффективные векторизованные вычисления в нисходящем направлении, а не на итерации.

person Martin Morgan    schedule 03.05.2013