Структуры ( ПЕРЕХОДНЫЕ ПРИСТАВКИ , в более общем плане) удобны, когда Вы предоставляете интерфейсу C-compatible реализацию C++, так как они являются портативными через границы языка и форматы компоновщика.
, Если это не беспокойство Вам, тогда я предполагаю, что использование "структуры" вместо "класса" является хорошим коммуникатором намерения (как @ZeroSignal сказал выше). Структуры также имеют более предсказуемую семантику копирования, таким образом, они полезны для данных, Вы намереваетесь записать во внешние медиа или отправить через провод.
Структуры также удобны для различных задач метапрограммирования, как шаблоны черт, которые просто представляют набор зависимых определений типов:
template struct type_traits {
typedef T type;
typedef T::iterator_type iterator_type;
...
};
... Но это действительно просто использует в своих интересах уровень защиты структуры по умолчанию быть общедоступным...
Обычно я начинаю с некоторой комбинации:
typeof(obj)
class(obj)
sapply(obj, class)
sapply(obj, attributes)
attributes(obj)
names(obj)
в зависимости от того, что раскрыто. Например, попробуйте:
obj <- data.frame(a=1:26, b=letters)
obj <- list(a=1:26, b=letters, c=list(d=1:26, e=letters))
data(cars)
obj <- lm(dist ~ speed, data=cars)
.. и т. Д.
Если obj
является объектом S3 или S4, вы также можете попробовать методы
или showMethods
, showClass
и т. Д. Патрик Бернс R Inferno имеет довольно хороший раздел по этому поводу (раздел № 7).
EDIT : Дирк и Хэдли упоминают str (obj)
в своих ответах. Это действительно намного лучше, чем что-либо из вышеперечисленного для быстрого и даже детального взгляда на объект.
Если я получаю 'someObject', скажем, через
someObject <- myMagicFunction(...)
, я обычно перехожу к
class(someObject)
str(someObject)
, за которым могут следовать head (), summary (), print (), ... в зависимости от вашего класса.
str(x)
Это все, что вам нужно помнить в 99% случаев.