Почему вы должны назначать 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