我正在创建一个OpenCPU应用程序,在用户单击按钮后,将训练,使用和保存分类模型。之后,用户应该能够在新数据中重复使用该模型。
我知道我应该可以使用session
ocpu.call()
对象来完成此操作
问题是:为什么当我使用ocpu.call()
调用R函数时,无法在R函数内打开文件(使用load()
或readRDS()
,具体取决于即使我已经向这个R函数发送了有效的URL,该文件是如何保存的?
返回的错误是:
OpenCPU错误HTTP 400无法打开连接
致电: gzfile(文件,“rb”)
OpenCPU错误HTTP 400 无法打开连接
致电: readChar(con,5L,useBytes = TRUE)
为了举例说明我的问题并准确显示我是如何尝试这样做的,我创建了一个JavaScript函数useOcpu()
和一个R函数saveOrLoadModel(modelPath)
。 useOcpu
用于调用saveOrLoadModel
,它首先会创建模型。 useOcpu
还存储在全局变量中返回的会话对象。如果再次调用useOcpu
,则会通过previousSession.GetFileURL("myFile.rds")
检索文件的路径并将其发送给saveOrLoadModel
,http://localhost:5656/ocpu/tmp/x00bfc5f8c0/files/m1.rds
会使用它来尝试打开文件并检索模型。此路径始终类似于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)
}
,并且是文件的有效路径。
他们是:
R功能
// 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);
});
}
JavaScript函数
Maven Projects
那么,我做错了什么?有一个更好的方法吗? 我应该以另一种方式解决这个问题吗?