2016-05-15 84 views
2

是否有一些可以将预测模型和其他复杂对象转换为JSON的良好R包?我从这个例子中的线性回归模型:R - 将R模型序列化为JSON

eruption.lm = lm(eruptions ~ waiting, data=faithful) 
newdata = data.frame(waiting=80) 
predict(eruption.lm, newdata) 

我想它的地方序列eruption.lm模型作为JSON存储或发送到一些外部系统,后来反序列化,做预测。 我曾尝试与jsonlite R package

json<-serializeJSON(eruption.lm) 
lin.model<-unserializeJSON(json) 

predict(lin.model, newdata) 

然而,jsonlite不能处理复杂的对象 - 反序列化的模型预测返回一个错误:

Error in eval(expr, envir, enclos) : could not find function "list" 

有一些更好的封装,可以序列化/反序列化对象。

回答

2

你只需要帮它记住terms环境:

attr(lin.model$terms, ".Environment") <- .GlobalEnv 

predict(lin.model, newdata) 

##  1 
## 4.17622 

我在http://github.com/jeroenooms/jsonlite/issues

或者超过该文件作为增强请求,您可以使用本机R二进制序列化:

saveRDS(lin.model, "lin.model.rds") 

predict(readRDS("lin.model.rds"), newdata) 

##  1 
## 4.17622 

除非你绝对需要文本序列化的方法,在这种情况下你可以这样做:

saveRDS(lin.model, file="lin.model.txt", ascii=TRUE) 

predict(readRDS("lin.model.txt"), newdata) 

##  1 
## 4.17622 

ascii=TRUE使对象的文本十六进制表示:

1f8b 0800 0000 0000 0003 ed5d c992 1cb9 
91bd e797 cc1c 9806 381c db51 36a6 c35c 
e61f 4a64 5153 3645 b255 2cb6 749a 6f1f 
5fb0 bcc8 ca62 4b1a 33f5 25da 8c6d 8848 
04fc f9f6 b004 10f5 870b 5d62 afa9 964b 
4cb1 71b8 d456 2f91 2e99 8afc f421 5e5b 
e510 73ef 9770 0d35 17aa 3d5f 6290 5fe3 
850a c59c 2ef9 f2f5 e1cb e3f7 4bd4 27c6 
bd18 2fff f69f 5f5f 1f5f 3e3e fef2 faef 
f36e bdfc f5e1 e9f5 e9eb 9f2f 94d9 4554 
1112 ae39 84dc 63d7 2287 de7a b2bb a975 
... (lots more) 

可以存储在地方的二进制块不能。

如果您需要可读的文本序列化方法,则提交上述建议的增强请求是非常有用的方法。

+0

谢谢,它的工作原理。我已经在GitHub中提交了增强请求。 –