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

时间:2014-06-07 14:07:36

标签: r oop reference-class

输出到pdf不能与R?

中的ReferenceClasses方法一起使用

这是一个取自ReferenceClasses R doc的例子,有一些小的 修改:

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文件。     知道为什么会这样吗?     

1 个答案:

答案 0 :(得分:1)

rm上调用xx,然后调用垃圾回收。然后将调用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