1

RのReferenceClassesメソッドでPDFへの出力が機能しない?

これは、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 ファイルにまったく書き込まれません。なぜこれが起こっているのですか?

4

1 に答える 1

1

rmonを呼び出して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)
}

methodsReference クラスではありません。これらは Reference クラスとは別の外部関数です。

したがって、ここでの主なポイントはfinalize、オブジェクトがガベージ コレクションされるまで呼び出されないことです。

于 2014-06-07T14:54:47.323 に答える