@ JDL, я выполнил ваше предложение использовать d$values$frequency
вместо cat_counts
и все еще имел ту же ошибку. Затем я вернулся и прошел по make_dem_class
, также, как вы и предлагали, наблюдая, как значения обновляются один за другим. И была проблема: первоначальное объявление cat_counts
как часть класса dem. Я назвал его целым числом, но это было два целых числа, по одному «count» для каждого «кота» или категории, число которых было cat_num
- в данном случае, 2. Когда я проверял класс объекта, из которого Я принимал cat_counts
Я нашел:
class(dd$values$frequency)
# "array"
Так что cat_counts
должен был быть объявлен как массив, а не как целое число. Вот правильный код:
dem <- setClass("dem",
slots = list(num_cats = "numeric",
cat_labels = "character",
cat_counts = "array",
cat_percents = "character")
)
setMethod("print",
"dem",
function(.Object,
x = numeric(0)) {
.Object <- dem
print(dem@cat_labels)
print(dem@cat_counts)
print(dem@cat_percents)
})
make_dem = function(dd) {
dem(
num_cats = length(dd$values),
cat_labels = dd$values$value,
cat_counts = dd$values$frequency,
cat_percents = calc_dem_percents(dd$values$frequency)
)
}
И это работает. Большое спасибо.
Но следующего шага нет. Используя make_dem_class()
, я создал dem_obj
, демографический объект класса dem
. Я сделал это так:
> dem_object <- make_dem_class(dd)
> dem_object
An object of class "dem"
Slot "num_cats":
[1] 2
Slot "cat_labels":
[1] "Male" "Female"
Slot "cat_counts":
[1] 308 139
Slot "cat_percents":
[1] "68.9%" "31.1%"
Вот его структура:
> str(dem_object)
Formal class 'dem' [package ".GlobalEnv"] with 4 slots
..@ num_cats : int 2
..@ cat_labels : chr [1:2] "Male" "Female"
..@ cat_counts : num [1:2(1d)] 308 139
..@ cat_percents: chr [1:2] "68.9%" "31.1%"
Но, похоже, что-то не так с моим setMethod
для печати, потому что, когда я пытаюсь его напечатать, это происходит:
Error in print(dem@cat_labels) :
no slot of name "cat_labels" for this object of class "classGeneratorFunction"
Так много можно узнать о работе с объектами S4. , , .