2017-08-28 11 views
1

でのMongoDBで使用するために/デシリアライズggplotオブジェクトをシリアライズする方法:私はこのコードを持っているR

for(plot in plotResults) { 
    .session$plots[[plot$id]] <- if (!is.null(plot[["grob"]])) { 
    plot[["grob"]] 
    } else { 
    plot[["plot"]] 
    } 
    ggsave(paste0(plot$id, ".png"), .session$plots[[plot$id]]) 
    ... 

}

ファイルが生成されますが、私はこのツールを使用してモンゴするggplotオブジェクトを保存する場合:

serializeObj <- function(obj) { 
    if (is.list(obj)) { 
    structure(lapply(obj, serializeObj), names = serializeNames(obj)) 
    } else { 
    rawToChar(serialize(obj, NULL, ascii = TRUE)) 
    } 
} 

deserializeObj <- function(obj) { 
    if (is.list(obj)) { 
    structure(lapply(obj, deserializeObj), names = unserializeNames(obj)) 
    } else if (is.serialized(obj)) { 
    unserialize(charToRaw(obj)) 
    } else { 
    obj 
    } 
} 

## Replaces characters illegal in Mongo names with "safe" substitutes 
safeNames <- function(value) { 
    gsub("\\.", "___DOT___", value) 
} 

## Replaces back "safe" substitutes 
unsafeNames <- function(value) { 
    gsub("___DOT___", ".", value) 
} 

serializeNames <- function(obj) { 
    lapply(names(obj), safeNames) 
} 

unserializeNames <- function(obj) { 
    lapply(names(obj), unsafeNames) 
} 

私はモンゴし、保存し、後でdeserializeObjが後モンゴから読み取る前に、私はserializeObjを実行していますよ。そして、ggplotオブジェクトの代わりに読んだ後、私はリストを持っており、そのリストにggsaveを呼び出すことはできません。

ggplotのようなオブジェクトをシリアル化し、それを逆シリアル化して同じオブジェクトを取得するにはどうすればよいですか?

+0

ggplotは(ネストされた)リストです。それを確認するには 'str'を使います。あなたのアプローチは属性、最も重要なクラス属性を失います。 – Roland

+0

@Rolandにはクラス属性を復元する方法がありますか? – jcubic

+1

'help(" attr ")'、 'help(" attributes ")'、もちろんそれらを最初に保存する必要があります。さもなければ、私たちはサブリストの属性のいくつかの手作業について話しています。 – Roland

答えて

0

あなたのコメントで指摘されているように、ggplotオブジェクトのクラスに関する情報が失われています。あなたはおそらく、この情報を保存して、シリアル化を解除するときにそれを回復するようにしてください。例えば、私は3つの簡単なf(x)を書いて助けになるかもしれません。

#### custom f(x)  
serializeGGClasses <- function(obj) { 
    serializeObj(sapply(obj, class)) 
} 

unserializeGGClasses <- function(obj) { 
    lapply(obj, (function(el) {unserialize(charToRaw(el)) })) 
} 

restoreGGClasses <- function(plot.obj, class.obj) { 
    class(plot.obj) <- c("gg", "ggplot") 
    for (i in 1:length(plot.obj)) { 
    class(plot.obj[[i]]) <- class.obj[[i]] 
    } 
    return(plot.obj) 
} 

### 

ここで、ggplotオブジェクトのすべてのクラスをシリアル化してデータベースに格納することができます。あなたがオブジェクトをretriveすると、あなたの代わりに、彼らは、ドットはもうのみプロットを入れ子になっていないため、再帰的なシリアライザ/デシリアライザ唯一のレベルは必要ありませんし、また名前をシリアル化する必要さを、彼らに

library(ggplot2)  
a<- qplot(1, 1) 
class(a)  # "gg"  "ggplot" 
is.list(a) # TRUE 

b <- serializeObj(a) 
b.class <- serializeGGClasses(a) 

# Unserialize 
c <- deserializeObj(b) 
c.class <- unserializeGGClasses(b.class) 

# Right now, "c" is just a list 
final.c <- restoreGGClasses(plot.obj = c, 
          class.obj = c.class) 

# "final.c" can be plotted 
final.c 
+0

残念ながら、これはうまくいきません、プロットはデシリアライズ後に乱れていました。再帰的アプローチは間違っていた。 – jcubic

0

この作品を復元する必要がありますデータにはそれらがありました。

serializePlots <- function(data) { 
    lapply(data, function(plot) { 
    rawToChar(serialize(plot, NULL, ascii = TRUE)) 
    }) 
} 

unserializePlots <- function(data) { 
    lapply(data, function(obj) { 
    if (is.serialized(obj)) { 
     unserialize(charToRaw(obj)) 
    } else { 
     obj 
    } 
    }) 
} 
関連する問題