【发布时间】:2017-11-20 14:05:00
【问题描述】:
我想学习 R 中的 OO 编程,作为练习,我正在编写一小组函数和方法来读写 Fortran 名称列表。我完全是个菜鸟,所以请善待下面的例子(你可以复制粘贴)。
我有以下类定义:
setClass("NamelistValue")
setClassUnion("NamelistValue", c("numeric", "character"))
setClass("Namelist",
representation(group = "character", variable = "character", value = "NamelistValue", comment = "character", file="character"),
prototype(group = NA_character_, variable = NA_character_, value = NA_real_, comment = NA_character_, file = NA_character_)
)
例如这些替换数据的方法:
setMethod("[<-", c("Namelist", "character", "character", "NamelistValue"),
function (x, i, j, ..., value) {
if (length(i) > 1 | length(j) > 1) stop("Cannot subset with more than one index")
l <- which(x@group==i)
v <- which(x@variable[l]==j)
vals <- x@value
vals[l][v] <- value
initialize(x, group=x@group, variable=x@variable, value=vals, comment=x@comment, file="<None>")
}
)
setMethod("[<-", c("Namelist", "missing", "character", "NamelistValue"),
function (x, i=NULL, j, ..., value) {
if (length(i) > 1 || length(j) > 1) stop("Cannot subset with more than one index")
v <- which(x@variable==j)
vals <- x@value
vals[v] <- value
initialize(x, group=x@group, variable=x@variable, value=vals, comment=x@comment, file="<None>")
}
)
现在我设置一个对象:
a <- new("Namelist", group="pippo", variable="ears", value=2, comment="Hi!")
让我们看看showMethods(class = "Namelist") 的方法,输出如下:
Function: [<- (package base)
x="Namelist", i="character", j="character", value="NamelistValue"
x="Namelist", i="missing", j="character", value="NamelistValue"
Function: initialize (package methods)
.Object="Namelist"
(inherited from: .Object="ANY")
看起来不错。现在我尝试用a[,"ears"] <- 4 替换一些值,命令失败:
Error in `[<-`(`*tmp*`, , "ears", value = 4) :
argument "i" is missing, with no default
但是,如果我再次尝试相同的命令成功...我从showMethods(class = "Namelist") 看到已经创建/继承了一些额外的方法:
Function: [<- (package base)
x="Namelist", i="character", j="character", value="NamelistValue"
x="Namelist", i="missing", j="character", value="NamelistValue"
x="Namelist", i="missing", j="character", value="numeric"
(inherited from: x="Namelist", i="missing", j="character", value="NamelistValue")
Function: initialize (package methods)
.Object="Namelist"
(inherited from: .Object="ANY")
这是为什么?为什么它首先不起作用,而仅在第二次尝试中起作用?我该如何解决这个问题?
【问题讨论】:
-
你有
[和[<-的方法吗?这可能与这些是内部泛型有关,但老实说我不太确定...... -
问题中的示例是 MRE,因此在 R 会话中没有做任何其他事情。