Почему вы должны назначать NA пустым прототипам, а не оставлять их пустыми?

Обсуждая прототипы S4, Хэдли заявляет, что

Пустое значение для возраста, вероятно, не то, что вы хотите

Вместо этого он устанавливает значение по умолчанию NA, Вот код

setClass("Person", representation(name = "character", age = "numeric"))

Для доступа к слотам объекта S4 вы используете @, а не $:

hadley <- new("Person", name = "Hadley")
hadley@age
# numeric(0)

Пустое значение для возраста, вероятно, не то, что вы хотите, поэтому вы также можете назначить прототип по умолчанию для класса:

setClass("Person", representation(name = "character", age = "numeric"), 
  prototype(name = NA_character_, age = NA_real_))
hadley <- new("Person", name = "Hadley")
hadley@age
# [1] NA

Каковы преимущества настройки NA прототип вместо того, чтобы оставить его пустым?

Разве это не влияет только на то, как вы проверяете, имеет ли слот значение не по умолчанию? т.е. length(hadley@age) == 0 против is.na(hadley@age)?

1 ответ

Одна из причин, по которой я мог придумать, состоит в том, что NAдайте NA по умолчанию. Предположим, что вы добавили следующий код, используя ваше первое определение Person

#your first definition of Person
setClass("Person", representation(name = "character", age = "numeric"))
hadley <- new("Person", name = "Hadley")
#new Person
Alex<-new("Person", name = "Alex",age=99)
#calculate mean age of two Persons
mean(unlist(lapply(list(hadley,Alex),function(person) person@age)))
#99

Возможно, вы неверно заключили, что средний возраст в вашей выборке 99тогда как вы не знаете возраст Хэдли.

Для второго определения лица вы получите NA

setClass("Person", representation(name = "character", age = "numeric"), 
  prototype(name = NA_character_, age = NA_real_))
hadley <- new("Person", name = "Hadley")
Alex<-new("Person", name = "Alex",age=99)
mean(unlist(lapply(list(hadley,Alex),function(person) person@age)))
#NA
Другие вопросы по тегам