我的previous question關於使用serialize()創建對象的CSV我從jmoy得到了一個很好的回答,他推薦了我的序列化文本的base64編碼。那正是我所期待的。奇怪的是,當我嘗試在實踐中使用它時,我得到的結果看起來不錯,但並不完全符合我在序列化/編碼過程中運行的結果。R:序列化base64對文本的編碼/解碼不完全匹配
下面的示例將帶有3個向量的列表並序列化每個向量。然後,每個矢量都以base64編碼,並與一個鍵一起寫入文本文件。關鍵僅僅是矢量的索引號。然後我反過來從csv讀取每一行。在最後你可以看到一些項目不匹配完全匹配。這是浮點問題嗎?還有別的嗎?
require(caTools)
randList <- NULL
set.seed(2)
randList[[1]] <- rnorm(100)
randList[[2]] <- rnorm(200)
randList[[3]] <- rnorm(300)
#delete file contents
fileName <- "/tmp/tmp.txt"
cat("", file=fileName, append=F)
i <- 1
for (item in randList) {
myLine <- paste(i, ",", base64encode(serialize(item, NULL, ascii=T)), "\n", sep="")
cat(myLine, file=fileName, append=T)
i <- i+1
}
linesIn <- readLines(fileName, n=-1)
parsedThing <- NULL
i <- 1
for (line in linesIn){
parsedThing[[i]] <- unserialize(base64decode(strsplit(linesIn[[i]], split=",")[[1]][[2]], "raw"))
i <- i+1
}
#floating point issue?
identical(randList, parsedThing)
for (i in 1:length(randList[[1]])) {
print(randList[[1]][[i]] == parsedThing[[1]][[i]])
}
i<-3
randList[[1]][[i]] == parsedThing[[1]][[i]]
randList[[1]][[i]]
parsedThing[[1]][[i]]
下面是刪節輸出:
> #floating point issue?
> identical(randList, parsedThing)
[1] FALSE
>
> for (i in 1:length(randList[[1]])) {
+ print(randList[[1]][[i]] == parsedThing[[1]][[i]])
+ }
[1] TRUE
[1] TRUE
[1] FALSE
[1] FALSE
[1] TRUE
[1] FALSE
[1] TRUE
[1] TRUE
[1] FALSE
[1] FALSE
...
>
> i<-3
> randList[[1]][[i]] == parsedThing[[1]][[i]]
[1] FALSE
>
> randList[[1]][[i]]
[1] 1.587845
> parsedThing[[1]][[i]]
[1] 1.587845
>
其實,我們看不到,你是與輸出有點太經濟。 – 2010-06-25 16:16:09