Как мне сделать массив классов в R? - PullRequest
3 голосов
/ 29 февраля 2012

Я хотел бы поместить объекты класса в массив, чтобы я мог ссылаться на несколько объектов класса.Однако информация о классе исчезает, когда я помещаю ее в массив.Как мне это исправить?

Ответы [ 2 ]

7 голосов
/ 29 февраля 2012

Массивы не являются подходящим инструментом для этого, поскольку они являются атомарными (поэтому допускают только один базовый тип данных), а также допускают только числовые или символьные данные.Список - это общий вектор в R, поэтому каждый компонент списка может содержать объекты любого типа.

Вот пример для двух пользовательских классов S3:

> foo <- 1:10
> class(foo) <- "foo"
> bar <- "a"
> class(bar) <- "bar"
> 
> obj <- list(foo = foo, bar = bar)
> obj
$foo
 [1]  1  2  3  4  5  6  7  8  9 10
attr(,"class")
[1] "foo"

$bar
[1] "a"
attr(,"class")
[1] "bar"
5 голосов
/ 29 февраля 2012

Я думаю, что вы неверно истолковываете понятие «массив» в R. Массив в R - это не вектор различных объектов, а многомерный объект, содержащий только элементы одного класса.list - это объект R, который можно использовать для хранения всего, что вы хотите.Если вы хотите, вы можете даже дать ему измерения, чтобы вы могли получить многомерный список, который бы соответствовал описанному вами массиву.Это должно быть проиндексировано в двойных квадратных скобках.

Пример:

# A list with different objects:
foo <- list("A","B","C","D",1,2,3,4,TRUE,TRUE,FALSE,FALSE)

# Add dimensions:
dim(foo) <- c(2,2,3)
> foo
, , 1

     [,1] [,2]
[1,] "A"  "C" 
[2,] "B"  "D" 

, , 2

     [,1] [,2]
[1,] 1    3   
[2,] 2    4   

, , 3

     [,1] [,2] 
[1,] TRUE FALSE
[2,] TRUE FALSE

# index row 1 col 1 slice 1
> foo[[1,1,1]]
[1] "A"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...