为什么要将NA分配给空原型而不是将其留空?

时间:2015-05-21 23:09:01

标签: r s4

在讨论S4 prototypes时,哈德利表示

  

年龄的空值可能不是您想要的

相反,他将默认值设置为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 vs is.na(hadley@age)

1 个答案:

答案 0 :(得分: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,而您却不知道Hadley的年龄。

对于Person的第二个定义,您将获得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