我想创建一个列表(基本上是一个带有自定义类的对象),其中一个元素中包含数据库,另一个元素则包含函数。在初始化列表之后,我希望能够调用该函数,并让它修改保存数据库的元素。这里有一个的例子
newObject<- function(dataSet){
rtrn <- list()
rtrn$dataHolder <- dataSet
rtrn$addition <- function(numberToAdd){
rtrn$dataHolder <- rtrn$dataHolder + numberToAdd
}
class(rtrn) <- "customClass"
return(rtrn)
}
x <- newObject(c(1,2,3))
x$addition(1)
调用addition()方法实际上不会修改dataHolder元素。我试过<lt;-作为赋值运算符(因为我在函数外修改变量),但这似乎也不起作用
您的示例几乎是一个闭包。如果您将您的"类"更正为:
newObject<- function(dataSet) {
dataHolder <- dataSet
addition <- function(numberToAdd){
dataHolder <<- dataHolder + numberToAdd
}
getdata <- function() {
dataHolder
}
rtrn <- list(addition = addition, getdata = getdata)
class(rtrn) <- "customClass"
return(rtrn)
}
你可以接近你想要的:
x <- newObject(c(1,2,3))
x$getdata()
[1] 1 2 3
x$addition(1)
x$getdata()
[1] 2 3 4
既然你定义了自己的类,你也可以定义一个打印函数:
print.customClass <- function(x){ print(x$getdata()) }
并通过查看"内部"
x
[1] 2 3 4