输出到pdf不能使用R中的referenceclass方法



输出到pdf不与R中的referenceclass方法一起工作?

这是取自referenceclass R文档的一个例子,有一些小的修改:

mEdit = setRefClass("mEdit", fields = list(data="matrix", edits="list"))
mEdit$methods(
    edit = function(i, j, value) {
        backup = list(i, j, data[i, j])
        data[i, j] <<- value
        edits <<- c(edits, list(backup))
        invisible(value)
    }
)
mEdit$methods(
undo = function() {
    prev = edits
    if(length(prev)) {
        prev = prev[[length(prev)]]
    }
    else {
        stop("No more edits to undo!")
    }
    edit(prev[[1]], prev[[2]], prev[[3]])
    length(edits) <<- length(edits) - 2
    invisible(prev)
}
)
mEdit$methods(
    show = function() {
        message("ClassName: ", classLabel(class(.self)))
        message("Data:")
        methods::show(data)
        message("Undo list length: ", length(edits))
    }
)
mEdit$methods(
    .DollarNames.mEdit = function(x, pattern) {
        grep(pattern, getRefClass(class(x))$methods(), value=TRUE)
    }
)
x = matrix(1:24, 3, 8)
xx = mEdit(data=x)
xx$edit(2,2,0)
xx$show()
xx$edit(3, 5, 1)
xx$show()
xx$undo()
xx$show()
mv = setRefClass(
"matrixViewer",
fields=c("viewerDevice", "viewerFile"),
contains="mEdit"
                 )
mv$methods(
    .DollarNames.mEdit = function(x, pattern) {
        grep(pattern, getRefClass(class(x))$methods(), value=TRUE)
    }
)
mv$methods(
    view = function() {
        ## dd = dev.cur();
        ## dev.set(viewerDevice)
        ## devAskNewPage(FALSE)
        image(
            data,
            main=paste("After", length(edits), "edits")
        )
        ## dev.set(dd)
    }
)
mv$methods(
    edit = function(i,j, value) {
        callSuper(i,j, value)
        view()
    }
)
mv$methods(
    initialize = function(file="./mv.pdf", ...) {
        viewerFile <<- file
        ## pdf(viewerFile)
        ## viewerDevice <<- dev.cur()
        ## dev.set(dev.prev())
        callSuper(...)
    }
)
mv$methods(
    finalize = function() {
        dev.off(viewerDevice)
    }
)

x = matrix(rnorm(64, 0, 34), 8, 8)
xx = mv(file="/tmp/x.pdf", data=x)
xx$edit(2,2,0)
xx$edit(3, 5, 1)
xx$edit(4, 4, 2.3)
xx$undo()
xx$view()

请注意,我已经注释掉了那些关于switch的行输出设备,所以它一直使用默认设备,否则为view方法时,该图根本不会写入PDF文件。知道为什么会这样吗?

xx上调用rm,然后调用垃圾回收。然后将调用finalize,它将调用dev.off,并将写入pdf。这假定所有内容都没有注释。

rm(xx)
gc()

你的.DollarNames也应该是

.DollarNames.mEdit = function(x, pattern) {
    grep(pattern, getRefClass(class(x))$methods(), value=TRUE)
}
.DollarNames.matrixViewer = function(x, pattern) {
    grep(pattern, getRefClass(class(x))$methods(), value=TRUE)
}

和不是Reference类的methods。它们是独立于Reference类的外部函数。

所以这里的主要要点是finalize在对象被垃圾收集之前不会被调用。

最新更新