2017-11-14 8 views
1

私はserialize関数でオブジェクトをシリアライズしています。例えば環境なしでクロージャをシリアライズ

serialize_object <- serialize(some_object, NULL) 

今は閉鎖に問題があります。例:

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

この生のオブジェクトclosure_serializedは大きく、約200MBです。私はそれが作られた環境も連載されていると確信しています。しかし私はその環境は必要ありません。私は閉鎖とその内容だけが必要です。

何か間違っていますか?閉鎖を間違った方法で初期化または定義していますか?どのようにして環境の残りではなくクロージャを直列化するだけですか?いくつかのパッケージからクロージャをシリアライズすると、この効果はありません。原因を見つけることができません。

+1

私は本当に答えてこのトピックに十分な自信がありません - しかし、私はこのブログの投稿があなたに非常に役立つかもしれないと信じています:http://www.win-vector.com/blog/2015/03/using- closure-as-objects-in-r /(特に「Closureの問題」セクションを参照してください) – HFBrowning

+0

コメント欄 – HFBrowning

+0

@HFBrowning、ありがとう!いくつかをクリアします。 –

答えて

0

これは主に、クロージャの定義が関数内にあるためです。

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() 

この場合、serialize関数も環境をコピーします。 "回避策"は、クロージャの定義をグローバル環境に配置することです。

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() 

serialize.GlobalEnv環境をコピーしません。関連トピックについては、hereも参照してください。

関連する問題