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(通过浏览器或通过卷曲)在/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时是否存在关于文件结构的限制,这可能会导致此问题?或者类定义文件可能是问题的原因?任何建议都表示赞赏。
答案 0 :(得分: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/
。