Есть ли у кого-нибудь опыт использования эталонных классов в качестве уровней фактора? Это один из шагов к моей цели — добавить поддержку «внешнего ключа» к data.frame
в одном из моих пакетов.
В конечном итоге я хочу создать data.frame
, который может хранить в виде целых чисел коды, связанные с фактором, но уровни этого фактора на самом деле являются объектами ссылочного класса, а не обычно используемыми факторами векторов символов. Мне удалось найти некоторую информацию об использовании объектов S4 в качестве уровней фактора, но похоже, что эти методы не работают для ссылочных классов.
Например, простой:
> myClass <- setRefClass("MyClass", fields=list(a="numeric", b="character"))
> myObj <- myClass$new(a=1, b="test")
> factor(myObj)
Error in unique.default(x) : unique() applies only to vectors
> as.character(myObj)
Error in as.vector(x, "character") :
cannot coerce type 'environment' to vector of type 'character'
> as.character.MyClass <- function(x){ x$b }
> as.character(myObj)
[1] "test"
> factor(myObj)
Error in unique.default(x) : unique() applies only to vectors
>
> unique.MyClass <- function (x, incomparables = FALSE, ...) { unique(as.character(x)) }
> factor(myObj)
Error in as.vector(x, mode) : invalid 'mode' argument
> traceback()
2: as.vector(exclude, typeof(x))
1: factor(myObj)
кажется, ничего не работает. Похоже, в лучшем случае я могу добраться до строки в factor()
, которая анализирует параметр exclude
:
exclude <- as.vector(exclude, typeof(x))
в этот момент все разваливается, так как мне не разрешено создавать вектор типа "S4".
Будем очень признательны за любые мысли о том, как решить этот или, что еще лучше, альтернативный подход к сопоставлению целого числа с объектом ссылочного класса data.frame
-дружественным способом!
Изменить: в ответ на вопрос @Aaron ниже:
Простым решением здесь было бы просто хранить целые числа в data.frame
, а затем поддерживать отдельный список/data.frame
, отвечающий за сопоставление этих идентификаторов с некоторыми другими данными (такими как объекты ссылочного класса). Это будет поддерживать все необходимые данные для выполнения того, что мне нужно, но будет менее элегантным для меня по нескольким причинам:
- Я предполагаю решение, которое позволило бы мне распечатать часть самого объекта эталонного класса, а не идентификатор. Например, если я сопоставляю идентификаторы сотрудников (целые числа) с классом «Сотрудники», я хотел бы, чтобы мой
data.frame
печатал имена сотрудников, а не их идентификаторы. - Я хотел бы иметь возможность извлекать объекты непосредственно из файла
data.frame
. Точно так жеas.character(myDataFrame$someColumn)
даст мне метки этого столбца (при условии, что это фактор), а не базовые целые числа, фактически хранящиеся вdata.frame
.
Опять же, я очень открыт для альтернативных решений этой проблемы, если есть лучший способ сделать это!
data-frame
-friendly. Кажется, что простое решение состоит в том, чтобы просто использовать обычное целое число во фрейме данных и иметь список соответствующих внешних по отношению к нему объектов. Что в этом для вас минус? - person Aaron left Stack Overflow   schedule 25.04.2013factor
, либо путем написания собственной функции для их создания. Другой — убедиться, что эти звери печатаются разумным образом, что не работает из коробки для их появления вdata.frame
. - person MvG   schedule 25.04.2013