R无法处理字符中的空字符串(\ 0),是否有人知道如何处理?更具体地说,我想使用ODBC或JDBC连接在数据库中存储复杂的R对象。由于复杂的R对象不容易映射到数据帧,因此我需要一种不同的方式来存储这些对象。对象可以是例如:
library(kernlab)
data(iris)
model <- ksvm(Species ~ ., data=iris, type="C-bsvc", kernel="rbfdot", kpar="automatic", C=10)
因为&gt; model&lt;不能直接存储在数据库中,我使用serialize()函数来检索对象的二进制表示(以便将其存储在BLOB列中):
serialModel <- serialize(model, NULL)
现在我想通过ODBC / JDBC存储它。为此,我需要对象的字符串表示,以便向数据库发送查询,例如,插入。由于结果是原始向量类型的向量,我需要转换它:
stringModel <- rawToChar(serialModel)
还有问题:
Error in rawToChar(serialModel) :
embedded nul in string: 'X\n\0\0\0\002\0\002\v\0......
R无法在字符串中处理\ 0。有没有人知道如何绕过这个限制?或者可能有一种完全不同的方法来实现这一目标?
提前致谢
答案 0 :(得分:10)
你需要
stringModel <- as.character(serialModel)
表示原始位代码的字符表示。 rawToChar将尝试转换原始位代码,在这种情况下,这不是您想要的。
生成的stringModel稍后可以通过以下方式转换回原始模型:
newSerialModel <- as.raw(as.hexmode(stringModel))
newModel <- unserialize(newSerialModel)
all.equal(model,newModel)
[1] TRUE
关于通过RODBC将二进制类型写入数据库:至于今天,vignette of RODBC读取(第11页):
二进制类型目前只能是 如此阅读,并将它们作为 “ODBC二进制”类的列是 原始载体列表。
答案 1 :(得分:4)
完全不同的方法是简单地将capture.output(dput(model))
的输出与描述性名称一起存储,然后使用<-
或assign()
重新构建它。请参阅以下有关capture.output()的需求的评论。
> dput(Mat1)
structure(list(Weight = c(7.6, 8.4, 8.6, 8.6, 1.4), Date = c("04/28/11",
"04/29/11", "04/29/11", "04/29/11", "05/01/11"), Time = c("09:30 ",
"03:11", "05:32", "09:53", "19:52")), .Names = c("Weight", "Date",
"Time"), row.names = c(NA, -5L), class = "data.frame")
> y <- capture.output(dput(Mat1))
> y <- paste(y, collapse="", sep="") # Needed because capture output breaks into multiple lines
> dget(textConnection(y))
Weight Date Time
1 7.6 04/28/11 09:30
2 8.4 04/29/11 03:11
3 8.6 04/29/11 05:32
4 8.6 04/29/11 09:53
5 1.4 05/01/11 19:52
> new.Mat <- dget(textConnection(y))