Как обрабатывать двоичные строки в R? - PullRequest
10 голосов
/ 10 мая 2011

R не может справиться с нулевыми строками (\ 0) в символах, кто-нибудь знает, как с этим справиться?Более конкретно, я хочу хранить сложные объекты R в базе данных, используя соединение ODBC или JDBC.Поскольку сложные объекты R не так легко отобразить в кадры данных, мне нужна другая возможность для хранения таких объектов.Объектом может быть, например:

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

Поскольку> модель <не может быть сохранена непосредственно в базе данных, я использую функцию serialize (), чтобы получить двоичное представление объекта (чтобы сохранить его встолбец BLOB): </p>

 serialModel <- serialize(model, NULL)

Теперь я хотел бы сохранить это через ODBC / JDBC.Для этого мне нужно строковое представление объекта, чтобы отправить запрос в базу данных, например, INSERT INTO.Поскольку в результате получается вектор типа raw vector, мне нужно преобразовать его:

 stringModel <- rawToChar(serialModel)

И возникает проблема:

Error in rawToChar(serialModel) : 
  embedded nul in string: 'X\n\0\0\0\002\0\002\v\0......

R не может справиться с \ 0в строках.У кого-нибудь есть идеи как обойти это ограничение?Или, возможно, существует совершенно иной подход к достижению этой цели?

Заранее спасибо

Ответы [ 2 ]

10 голосов
/ 10 мая 2011

Вам нужно

stringModel <- as.character(serialModel)

для символьного представления необработанных битовых кодов. rawToChar попытается преобразовать необработанные битовые коды, что в данном случае не то, что вам нужно.

Получившийся в результате stringModel позже может быть преобразован обратно в исходную модель:

newSerialModel <- as.raw(as.hexmode(stringModel))
newModel <- unserialize(newSerialModel)
all.equal(model,newModel)
[1] TRUE

Относительно записи двоичных типов в базы данных через RODBC: на сегодняшний день виньетка RODBC гласит (стр.11):

Бинарные типы в настоящее время могут быть только читать как таковой, и они возвращаются как столбец класса "ODBC двоичный", который является список необработанных векторов.

4 голосов
/ 10 мая 2011

Совершенно другой подход заключается в том, чтобы просто сохранить выходные данные 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...