如何使用前一个R会话中保存的模型(使用OpenCPU和JavaScript)?
我正在创建一个OpenCPU应用程序,在用户点击一个按钮后,一个分类模型被训练、使用和保存。稍后,用户应该能够在新数据中重新使用模型 我知道我应该能够通过使用如何使用前一个R会话中保存的模型(使用OpenCPU和JavaScript)?,javascript,r,session,opencpu,Javascript,R,Session,Opencpu,我正在创建一个OpenCPU应用程序,在用户点击一个按钮后,一个分类模型被训练、使用和保存。稍后,用户应该能够在新数据中重新使用模型 我知道我应该能够通过使用ocpu.call() 问题是:为什么当我使用ocpu.call()调用R函数时,即使我向该R函数发送了有效的URL,我也不能打开R函数内部的文件(使用load()或readRDS(),具体取决于文件的保存方式) 返回的错误为: 使用saveRDS/readRDS时: OpenCPU错误HTTP 400无法打开连接 待命: gzfile
ocpu.call()
问题是:为什么当我使用ocpu.call()
调用R函数时,即使我向该R函数发送了有效的URL,我也不能打开R函数内部的文件(使用load()
或readRDS()
,具体取决于文件的保存方式)
返回的错误为:
- 使用saveRDS/readRDS时:
- 使用“保存/加载”时:
useOcpu()
和一个R函数saveOrLoadModel(modelPath)
useOcpu
用于调用saveOrLoadModel
,它首先创建模型useOcpu
还将返回的会话对象存储在全局变量中。如果再次调用useOcpu
,则通过previousSession.GetFileURL(“myFile.rds”)
检索文件路径,并发送到saveOrLoadModel
,后者使用该路径尝试打开文件并检索模型。此路径始终类似于
,并且是文件的有效路径
这些是:
R功能
saveOrLoadModel <- function(modelPath){
library(caret)
filename <- "file:///somePathToTheData/iris_original.csv"
ds <- read.csv(filename, header = TRUE)
index <- createDataPartition(ds$class, p=0.80, list=FALSE)
testset <- ds[-index,]
trainset <- ds[index,]
m1 <- NULL
if(modelPath == ""){
m1 <- train(class ~., method = "rpart", data=trainset)
# the file is saved normally
saveRDS(m1, file = "m1.rds")
# this works too
#save(m1, file="m1.rds")
}
else{
# neither work...
m1 <- readRDS(modelPath)
#load(modelPath)
}
predictions <- predict(object = m1$finalModel,newdata = testset[,1:length(colnames(trainset)) - 1],type="class")
return(predictions)
}
// global variable used to save the session object
var previousSession = null;
useOcpu = function(){
var path = "";
if(previousSession != null)
path = previousSession.getFileURL("m1.rds");
console.log("path is: " + path);
var req = ocpu.call("saveOrLoadModel",
{
modelPath : path
}, function(session) {
previousSession = session;
session.getObject(function(data){
console.log(data);
});
});
//if R returns an error, alert the error message
req.fail(function() {
alert("Server error: " + req.responseText);
});
}
那么,我做错了什么?有更好的方法吗?
我应该用另一种方式来处理这个问题吗