1

输出到pdf不能与R中的ReferenceClasses方法一起使用?

这是一个取自 ReferenceClasses 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()

请注意,我已经注释掉了有关输出设备切换的那些行,因此它始终使用默认设备,否则当view调用该方法时,绘图根本不会写入 pdf 文件。知道为什么会这样吗?

4

1 回答 1

1

调用rmxx然后调用垃圾收集。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)
}

并且不methods属于 Reference 类。它们是独立于参考类的外部函数。

所以这里的主要内容finalize是直到对象被垃圾收集后才会调用。

于 2014-06-07T14:54:47.323 回答