2

CI 为 OpenCPU 编写了一个 R 包,想在我自己的云服务器上使用它。即使包本身被识别并且可以更新,我也无法访问任何功能,并且我可以通过 POST 和 GET 通常访问其他(非自定义,例如基本或统计)包。

我已经安装了自定义包以及所有依赖项,/usr/local/lib/R/site-library并且可以在服务器上本地使用 R 会话中的函数。

> TestConnectivity
function (x = 100) 
{
    return(sum(rnorm(x)))
}
<environment: namespace:MyPkg>
> TestConnectivity()
[1] 4.174071

该函数已正确导出(使用 roxygen2 的文档):

> getNamespaceExports("MyPkg")
[1] "TestConnectivity"

但是当我通过 OpenCPU(通过浏览器或 curl)访问它时/ocpu/library/MyPkg/R/TestConnectivity,我得到:

object 'TestConnectivity' not found

In call:
get(reqobject, paste("package", reqpackage, sep = ":"), inherits = FALSE)

/ocpu/library/MyPkg/R/也是空白的(通常需要导出函数的列表),但包本身可以通过浏览器在以下位置看到/ocpu/library/MyPkg/

    Information on package 'MyPkg'

Description:

Package:       MyPkg
Description:   in development ...
Type:          Package
Version:       0.1.2
[...]

Index:

TestConnectivity        Test Connectivity of OpenCPU
MyPkg                   Provide R analysis of stored data.
MyPkg-package           Calculation package

我已将其名称添加到 中的预加载字段中/etc/opencpu/server.conf,但/ocpu/info仅显示为loaded via a namespace (and not attached): [n] MyPkg_0.1.2. 我不知道,如果这有问题。

我还添加了对软件包功能所需的所有文件的访问权限/etc/apparmor.d/opencpu.d/custom,例如用于 ODBC 数据库连接的 DSN 配置文件。

包本身不仅包含函数,还包含组装R6S3类定义(单个文件中的继承)——TestConnectivity()尽管如此,它们都没有在 . 函数也并不总是放置在与函数名称完全相同的文件中 - 有时多个文件组合在一个文件中。(TestConnectivity()放在相应的TestConnectivity.R文件中 - 如果重要的话。)

与在本地使用包相比,使用 OpenCPU 时文件结构是否存在一些限制,这可能会导致此问题?或者类定义文件可能是造成问题的原因?任何建议表示赞赏。

4

1 回答 1

1

感谢您的回答(以及在 OpenCPU 上的出色工作,顺便说一句......)!

我通过简单地安装包解决了我的问题/home/myUser/R/3.1/library,例如.libPaths()[1](或R-LIBS-USER[1])而不是/usr/local/lib/R/site-library

我通过逐步构建一个越来越复杂的测试包来实现这一目标......在我几乎拥有我的实际项目结构的时候,它仍然有效。唯一不同的是安装路径。

总而言之,这可能是我的虚拟机上的权限管理问题,而不是 OpenCPU 或我的包的问题。很抱歉,我无法提供更多信息 - 如果我偶然发现某些东西,我会在此处添加。

编辑-我忘记了:当然,网址从更改/ocpu/library/MyPkg/R//ocpu/user/MyUsername/library/MyPkg/R/.

于 2014-08-13T13:25:35.980 回答