S3类的奇怪行为

时间:2015-12-04 08:49:58

标签: r

我用可重复的例子重写了这篇文章。

运行以下代码将创建两个对象: eem eem2 。此外,类eem还有一个names.eem函数,用于检索 sample 字段的值。

Project

让我们创建两个不同的对象:

names.eem <- function(x, ...){
  x$sample
}

# First constructor
eem1 <- function(sample){
  eem <- list(sample = sample)
  class(eem) <- "eem"
  return(eem)
}

# Second constructor
eem2 <- function(sample){
  eem <- list(sample = sample)
  class(eem) <- "eem2"
  return(eem)
}

test1 <- eem1("justaname")
test2 <- eem2("justaname")

这是“窃听”:

test1 <- eem1("justaname")
test2 <- eem2("justaname")

没关系:

> str(test1)
List of 1
 $ justaname: chr "justaname"
 - attr(*, "class")= chr "eem"

两个对象之间唯一不同的是,它有一个与之关联的S3函数(names.eem)。

这是我的SessionInfo()

> str(test2)
List of 1
 $ sample: chr "justaname"
 - attr(*, "class")= chr "eem2"

1 个答案:

答案 0 :(得分:1)

我不认为这是一个错误,而是由R中的共享命名空间引起的混乱,并且是由您设置的“eem”类引起的。

当你说:

eem1 <- function(sample){
    eem <- list(sample = sample)
    class(eem) <- "eem"
    return(eem)

}

test1 <- eem1("justname")

在函数内部发生以下情况: eem首先成为一个列表,其中包含一个名为sample with value =“justname”的元素。 然后,当您将类“eem”分配给eem时。它会将元素名称更改为函数内x$sample的{​​{1}}。

所以,我不会将此标记为错误。您只需要小心如何在同一环境中命名变量。

另外,我建议不要将输入变量“sample”称为基本R中的有效函数。

希望这有帮助。