в моем предыдущем вопросе об использовании serialize () для создания CSV объектов я получил отличный ответ от jmoy, где он рекомендовал кодирование 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
>