在我关于使用serialize()创建对象CSV的之前的问题中,jmoy给出了一个很好的答案,他建议对序列化文本进行base64编码。这正是我想要的。但奇怪的是,当我尝试实践时,得到的结果看起来是正确的,但却不完全匹配我运行过的序列化/编码过程。
下面的示例将包含3个向量的列表进行序列化。然后对每个向量进行base64编码,并将其与键一起写入文本文件。键只是向量的索引号。然后我反向执行该过程,并从CSV中读取每行。最后你可以看到有些项并没有完全匹配。这是否是浮点数问题?还是其他原因?
以下是简化版输出:
下面的示例将包含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
>