Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用前一个R会话中保存的模型(使用OpenCPU和JavaScript)?_Javascript_R_Session_Opencpu - Fatal编程技术网

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

如何使用前一个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

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

我知道我应该能够通过使用
ocpu.call()

问题是:为什么当我使用
ocpu.call()
调用R函数时,即使我向该R函数发送了有效的URL,我也不能打开R函数内部的文件(使用
load()
readRDS()
,具体取决于文件的保存方式)

返回的错误为:

  • 使用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”)
检索文件路径,并发送到
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);
       });
}
那么,我做错了什么?有更好的方法吗? 我应该用另一种方式来处理这个问题吗