我编写了一个具有以下功能的堆栈“类”:add
,push
,pop
,size
,isEmpty
,clear
(还有更多)。
我想将此“类”用作R中的泛型,因此我可以在脚本中创建堆栈的多个实例。我该怎么做呢?
(我用引号引起了类,因为我的堆栈函数是用不同的脚本编写的(不一定是类本身的定义)
提前致谢
list <- ""
cursor = 0
#Initializes stack to empty
stack <- function(){
list <- c()
cursor = -1
assign("list",list,.GlobalEnv)
assign("cursor",cursor,.GlobalEnv)
}
#Where item is a item to be added to generic list
push <- function(item){
if(size(list) == 0){
add(item, -1)
}else{
add(item, 0)
}
assign("list",list,.GlobalEnv)
}
最佳答案
这是堆栈实现@GSee引用的简化版本,避免使用R中可用的任何形式化的面向对象系统。简化过程是由于R中的所有函数都是闭包,并且在函数调用期间创建的函数都绑定(bind)到了为该调用创建的环境。
new_stack <- function() {
stack <- vector()
push <- function(x) stack <<- c(stack, x)
pop <- function() {
tmp<-tail(stack, 1)
stack<<-stack[-length(stack)]
return(tmp)
}
structure(list(pop=pop, push=push), class='stack')
}
x <- new_stack()
x$push(1:3)
x$pop()
# [1] 3
x$pop()
# [1] 2
这是一个S4实现,用于比较。
setClass('Stack',
representation(list='list', cursor='numeric'), # type defs
prototype(list=list(), cursor=NA_real_)) # default values
setGeneric('push', function(obj, ...) standardGeneric('push'))
setMethod('push', signature(obj='Stack'),
function(obj, x) {
obj@list <- c(x, obj@list)
obj
})
setGeneric('pop', function(obj, ...) standardGeneric('pop'))
setMethod('pop', signature(obj='Stack'),
function(obj) {
obj@cursor <- obj@list[[1]]
obj@list <- obj@list[-1]
obj
}
)
x <- new('Stack')
# cursor is empty to start
x@cursor
#[1] NA
# add items
x <- push(x, 1)
x <- push(x, 2)
# pop them (move next item to cursor, remove from list)
x <- pop(x)
x@cursor
# [1] 2
x <- pop(x)
x@cursor
# [1] 1
关于r - R内的通用“classes”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14488206/