【发布时间】:2014-08-13 09:30:14
【问题描述】:
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 配置文件。
包本身不仅包含函数,还包含组装的R6 和S3 类定义(单个文件中的继承)——尽管如此,它们都没有在TestConnectivity() 中使用。函数也不总是放置在与函数同名的文件中 - 有时多个文件组合在一个文件中。 (TestConnectivity() 放置在相应的 TestConnectivity.R 文件中 - 如果重要的话。)
相对于在本地使用包,在使用 OpenCPU 时文件结构是否存在一些限制,这可能会导致此问题?或者类定义文件可能是造成问题的原因?任何建议表示赞赏。
【问题讨论】:
-
你似乎做对了。 OpenCPU 中的 R 包没有额外的限制。您的代码是否在某处公开可用?还是显示问题的简单版本的软件包?如果您提供一个我们可以测试的示例,会更容易为您提供帮助。