【问题标题】:object 'Cdqrls' not found when building R packages using devtools使用 devtools 构建 R 包时找不到对象“Cdqrls”
【发布时间】:2013-04-09 00:33:01
【问题描述】:

如标题所示,出现错误

Error: object 'Cdqrls' not found

我使用devtools 构建 R 包,我使用了当前包中的一个函数

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

并且还在src文件夹中包含一个lm.c文件,其中包括:

...
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 源文件复制。当我在devtools 中使用load_all() 时,它用新文件lm.oMyPkgName.so 编译src/ 中的共享对象(我检查过它运行良好)。但是,从devtools的wiki,我发现

load_all ignores the package NAMESPACE

如果工作正常,我想通过运行一些函数,我可以更新 NAMESPACE 文件以包含useDynLib(MyPkgName, Cdqrls)。那是对的吗?我认为这样错误可能会消失......任何建议都非常感谢!

更新

根据@mnel 和this 的帖子,似乎使用@useDynLib 应该可以工作。但是,我使用的函数 .Call() 没有记录,并且有几个函数使用了 .Call,所以我个人不想记录它们,因为它们不用于最终用户。因此,我应该把@useDynLib放在哪里?

【问题讨论】:

  • 您是否使用roxygen 来创建您的包?如果是这样stackoverflow.com/questions/8407615/…
  • @mnel:谢谢!我正在使用roxygen2。我阅读了您提到的帖子,似乎@useDynLib 是可以使用的。请参阅上面的更新帖子;-)
  • @mnel:顺便说一句,我应该使用@useDynLib Cdqrls 吗?谢谢!
  • 更有可能是@useDynLib yourpackagename,或者@useDynLib stats,如果你想使用stats包中的Cdqrls....
  • @mnel:谢谢!我使用了@useDynLib pkgname Cdqrls,它现在可以工作了;-)

标签: r package devtools


【解决方案1】:

答案是通过 roxygen2 使用@useDynLib PkgName Routine1 Routine2,这样一旦在devtools 中运行document() 函数,NAMESPACE 文件将包含useDynLib(PkgName,Routine1,Routine2),它将完美运行。

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2017-05-14
    • 2020-03-29
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多