我用可重复的例子重写了这篇文章。
运行以下代码将创建两个对象: 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"
答案 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中的有效函数。
希望这有帮助。