【问题标题】:OpenCPU: Reuse results from previous session not workingOpenCPU:重用先前会话的结果不起作用
【发布时间】:2019-06-17 17:26:20
【问题描述】:

我想使用save_iris_as_csv 来保存一个.csv 文件。然后,调用catch_url_and_download 以使用save_iris_as_csv 返回的会话下载此.csv 文件。但是catch_url_and_download不起作用,返回错误

OpenCPU error HTTP 400
cannot open URL 'http://localhost:5656/ocpu/tmp/x06c27c3ac4/files/iris.csv'

网址可以手动打开。只是第二个R功能无法打开它。

以下是我的 javascript 代码。

ocpu.call("save_iris_as_csv",{},function(session){
    console.log("save_iris_as_csv is good.")
    console.log(session)
    console.log("trying to call catch_url_and_download.")
    ocpu.call("catch_url_and_download",{
        url:session.loc + "files/iris.csv"
    },function(session2){
        console.log(session2)
    }).fail(function(e){
        console.log("catch_url_and_download failed. Cannot open URL xxx.")
        alert(e.responseText)
    })
})

以下是我的 R 代码。

save_iris_as_csv = function(){
  write.csv(iris,"iris.csv")
}
catch_url_and_download = function(url){
  download.file(url,"iris.csv")
}

我使用的是 Windows 操作系统。

【问题讨论】:

  • 如果收到 HTTP 400,则错误消息在消息正文中。
  • 你能把它放在一个应用程序(包)中,以便我们轻松复制它吗?
  • @Jeroen,嗨,事实证明代码在cloud 中运行良好。但它在本地不起作用。您可以在本地尝试我的 GitHub demo R package。我正在使用 Windows。我也在Mac上测试过。他们不工作。我不知道为什么。

标签: r opencpu


【解决方案1】:

这里的问题是 R 是单线程的,因此 httpuv 网络服务器(opencpu 单用户服务器所基于的)一次只能处理一个请求。在您的示例中,您创建了一个网格锁。

您的示例向函数发出请求,然后使用download.file()同一网络服务器发出第二次请求。当第一个请求完成时,第二个请求被 httpuv 排队等待处理,但显然这永远不会发生,因为download.file() 只是一直等待,直到超时。

这在云服务器中不会​​发生,因为 apache2 是多线程的。

要使其与单用户服务器一起工作,您可以让第一个函数将数据保存为工作区中的对象,然后第二个函数可以通过会话密钥访问它。或者,您可以将其保存在磁盘或数据库或其他东西中,第二个功能可以访问它。任何不需要与同一本地服务器建立第二个 http 连接的东西。

【讨论】:

  • 谢谢!如何将数据准确地保存为工作区中的对象?通过使用save(iris, file = "test.RData")?如果是这样,第二个函数仍然无法使用会话密钥读取它,因为由于单线程问题,无法使用 load() 函数加载 url (session.loc + "files/test.RData")。我已将新代码上传到Github
  • 最好的方法是让你的目标函数返回 R 对象。这样它会自动保存。
猜你喜欢
  • 2012-10-15
  • 1970-01-01
  • 2013-10-05
  • 2018-05-31
  • 1970-01-01
  • 2021-09-16
  • 2017-09-02
  • 2018-10-30
相关资源
最近更新 更多