如何使用先前R会话中保存的模型(使用OpenCPU和JavaScript)?

时间:2017-08-03 04:35:11

标签: javascript r session opencpu

我正在创建一个OpenCPU应用程序,在用户单击按钮后,将训练,使用和保存分类模型。之后,用户应该能够在新数据中重复使用该模型。

我知道我应该可以使用session

返回的ocpu.call()对象来完成此操作

问题是:为什么当我使用ocpu.call()调用R函数时,无法在R函数内打开文件(使用load()readRDS(),具体取决于即使我已经向这个R函数发送了有效的URL,该文件是如何保存的?

返回的错误是:

  • 使用saveRDS / readRDS时:
  

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")检索文件的路径并将其发送给saveOrLoadModelhttp://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

那么,我做错了什么?有一个更好的方法吗? 我应该以另一种方式解决这个问题吗?

0 个答案:

没有答案