首页 文章

如何处理R中的二进制字符串?

提问于
浏览
10

R无法处理字符中的空字符串(\ 0),是否有人知道如何处理这个?更具体地说,我想使用ODBC或JDBC连接在数据库中存储复杂的R对象 . 由于复杂的R对象不容易映射到数据帧,因此我需要一种不同的方式来存储这些对象 . 一个对象可以是例如:

library(kernlab)
data(iris)
model <- ksvm(Species ~ ., data=iris, type="C-bsvc", kernel="rbfdot", kpar="automatic", C=10)

因为> model <不能直接存储在数据库中,所以我使用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 . 有没有人知道如何绕过这个限制?或者可能有一种完全不同的方法来实现这一目标?

提前致谢

2 回答

  • 4

    你需要

    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二进制”类的列返回,它是一个原始向量列表 .

  • 10

    一种完全不同的方法是简单地将 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))
    

相关问题