2013-10-09 51 views
0

我正在编写我的包并在加载我的包时收到警告。我用的是Cdqrls在我的一些代码:.Call(Cdqrls, x[, id1, drop=FALSE] * w, w * z, epsilon)我还包括一个lm.c文件中src文件夹,包括:未能在构建R包时为Cdqrls分配NativeSymbolInfo

... 
SEXP Cdqrls(SEXP x, SEXP y, SEXP tol) 
{ 
    SEXP ans, ansnames; 
    SEXP qr, coefficients, residuals, effects, pivot, qraux; 
    int n, ny = 0, p, rank, nprotect = 4, pivoted = 0; 
    double rtol = asReal(tol), *work; 
... 

然而,当我安装我的R中包,以下警告消息出现:

Warning message: 
In FUN(1L[[1L]], ...) : 
    failed to assign NativeSymbolInfo for Cdqrls since Cdqrls is already defined in the ‘My_Package_Name’ namespace 

我Google这样的警告消息,但一无所获。所以我有两个具体的问题:

  1. 有没有人遇到过这种警告?或者有人可以给我一些关于潜在错误/错误的建议吗?

  2. 此警告不会影响我现在运行的代码,但它很烦人。当我的最终用户加载软件包时,有没有办法抑制这个警告信息? (对不起,我知道这应该是可以避免的,但只是好奇:)

更新

又一个音符,可以帮助调试问题:我用

##' @useDynLib My_Pkg_Name Cdqrls 
##' @keywords internal 

的功能其中使用.Call(...)

回答

1

我相信这意味着您的软件包名称空间中有一个名为Cdqrls的对象,它是本机符号的名称。周围

的一种方法是改变你的.Call到:

.Call("Cdqrls", x[,id1,drop=FALSE]*w, w*z, epsilon, PACKAGE="My_Package_Name") 

或者你可以改变本地符号或其他物体。

+0

感谢您的回复!我改变了我的包名称,但它仍然显示加载时的警告...顺便说一句,本机符号是什么? – alittleboy

+0

@alittleboy:“本地符号”是C/C++/Fortran函数的名称。请注意,我不只是添加'PACKAGE'参数,我将'.Call(Cdqrls,...)'改为'.Call(“Cdqrls”,...)'。是你做的吗? –

+0

谢谢!我改为“Cdqrls”,但仍显示消息。目前我在/ src文件夹中有以下文件:'lm.c','lm.o'和'My_Pkg.so',其中'lm.c'是从base R直接获取的。我还尝试将其更改为' PACKAGE =“base”'但仍然无法工作... – alittleboy