2014-06-07 39 views
1

輸出到pdf不能與R中的ReferenceClasses方法一起使用?輸出爲PDF不能與R中的ReferenceClasses方法一起使用?

這是從ReferenceClassesř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

致電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) 
} 

,並不Reference類的methods。它們是獨立於Reference類的外部函數。

所以這裏主要的外賣是finalize不被調用,直到對象被垃圾收集。

相關問題