2017-11-14 1 views
1

Ich bin Objekte mit der serialize Funktion Serialisierung.Serialize Schließung ohne Umgebung

Zum Beispiel

serialize_object <- serialize(some_object, NULL) 

Jetzt habe ich ein Problem mit Schließungen. Zum Beispiel:

closure <- function(){ 
    member <- NULL 
    list(init=function(val){member <<- val}) 
} 
closure_serialized <- serialize(closure(), NULL) 

Dieses rohe Objekt closure_serialized ist riesig: einige 200MB. Ich bin mir ziemlich sicher, dass auch die Umgebung, in der es hergestellt wird, serialisiert ist. Aber ich brauche seine Umgebung nicht. Ich brauche nur den Verschluss und seinen Inhalt.

Mache ich etwas falsch? Initialisiere oder definiere ich die Schließung falsch? Wie kann ich es nur machen, um den Verschluss und nicht den Rest der Umgebung zu serialisieren? Serialisierungsabschlüsse von einigen Paketen haben diesen Effekt nicht, und ich kann den Schuldigen nicht finden.

+1

Ich habe nicht genug Vertrauen in dieses Thema, um wirklich zu beantworten - aber ich glaube, dass dieser Blogbeitrag für Sie sehr hilfreich sein könnte: http://www.win-vector.com/blog/2015/03/using- Verschlüsse-als-Objekte-in-r/(besonders siehe Abschnitt "Probleme mit R-Verschlüsse") – HFBrowning

+0

Lesen Sie auch die Kommentare – HFBrowning

+0

@HFBrowning, danke! Räumt ein paar Dinge auf. –

Antwort

0

Dies liegt hauptsächlich daran, dass die Definition des Abschlusses innerhalb einer Funktion liegt.

fn <- function(){ 

    # make big variables 

    closure <- function(){ 
     member <- NULL 
     list(init=function(val){member <<- val}) 
    } 

    closure_serialized <- serialize(closure(), NULL) 
} 

# serialize will copy the environment within the function in closure_serialized 
fn() 

Die serialize Funktion wird in diesem Fall auch die Umwelt kopieren. Ein "Workaround" ist die Definition der Schließung in der globalen Umgebung.

closure <- function(){ 
    member <- NULL 
    list(init=function(val){member <<- val}) 
} 

fn <- function(){ 

    # make big variables 

    closure_serialized <- serialize(closure(), NULL) 
} 

# serialize will not copy the global environment. 
fn() 

Die serialize kopiert nicht .GlobalEnv Umgebung. Siehe auch here für ein ähnliches Thema.