【问题标题】:Error when building R package using roxygen2使用 roxygen2 构建 R 包时出错
【发布时间】:2014-05-26 12:15:16
【问题描述】:

我有 2 个文件,Rfile.R 和 Cppfile.cpp。

Cppfile.cpp 中的内容:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int CPPF(int k){return ++k;}

Rfile.R 中的内容:

RF<-function(k){return(CPPF(k))}

我想基于 2 个文件构建一个 R 包。我使用最新版本的 Rstudio 和 Roxygen2。

我尝试了 3 种方法来构建使用或不使用 Roxygen2 的包,并得到了不同的结果:

  1. New Project->New Directory->R package->Type:Package w/Rcpp,添加 Rfile.R 和 Cppfile.cpp 作为源文件。构建并重新加载,一切正常。这些功能照常工作。

  2. New Project->New Directory->R package->Type:Package w/Rcpp,添加 Rfile.R 和 Cppfile.cpp 作为源文件。选择“使用 Roxygen 生成文档”,检查其所有选项。 Build & Reload,功能不起作用。输入“RF”给出RF的内容,输入“CPPF”弹出“Object not found”。

  3. New Project->New Directory->R package->Type:Package w/Rcpp,仅添加 Cppfile.cpp 作为源文件。选择“使用 Roxygen 生成文档”,检查其所有选项。构建并重新加载,该功能有效。 然后将Rfile.R直接复制到项目文件夹->R文件夹中。 Build & Reload,一切正常,功能运行良好。

是我使用了 Roxygen 错误还是 Roxygen 有错误?我需要它来记录。我可以坚持第三种方式,这花了我很多精力才能找到,但是有线。

谢谢!

解决问题的一种方法: 选择“使用 Roxygen 生成文档”时,不要勾选“NAMESPACE 文件”选项。

【问题讨论】:

    标签: r rcpp roxygen2


    【解决方案1】:

    您混淆了两件事(不幸的是,这很容易混淆):

    首先,// [[Rcpp::export]] 属性用于在 RcppExports.cppRcppExports.R 两个文件中自动生成包装函数。包装器 R 函数 CPPF 将由此处的 Rcpp::compileAttributes() 自动生成,并放入 R/RcppExports.R 中。

    第二,roxygen cmets 可以用来管理NAMESPACE,例如带有@export 标签。请注意,这与// [[Rcpp::export]]!

    不同

    自动生成的函数不会自动导出。 Rcpp.package.skeleton() 将生成一个NAMESPACE 文件,该文件会自动导出给定名称的所有函数;即exportPattern("^[[:alpha:]]+") 条目。这对于小包装来说已经足够了;但是随着您的包变得越来越复杂,您将需要对命名空间进行更细粒度的控制。或者您可以采用一个约定,所有内部的、非导出的函数都以. 开头。无论哪种方式,这种机制都允许将自动生成的函数导出到您的包命名空间。

    如果你想使用roxygen 来管理NAMESPACE,你需要将roxygen cmets 添加到你的C++ 函数中,如果你想在命名空间中导出它们。所以你可以修改你的函数如下:

    #include <Rcpp.h>
    using namespace Rcpp;
    
    //' @export
    // [[Rcpp::export]]
    int CPPF(int k){return ++k;}
    

    请注意,对于新版本的roxygen2,您可能必须运行roxygen2::upgradeRoxygen() 以确保roxygen2 接管NAMESPACE

    【讨论】:

      【解决方案2】:

      因此,如果 2. 不起作用,请将其作为(可重现的)错误报告提交给 roxygen2 团队。

      我没有发现 Rcpp 问题; Imports: / NAMESPACE 声明可能出现问题。我在这里没有看到 Rcpp 问题(因为 1. 工作正常)。

      FWIW 我也在一些包上使用了 roxygen2,我也时常在 RStudio 中构建它们。

      【讨论】:

      • 我刚刚发现问题实际上出在 NAMESPACE 文件中。谢谢!
      • 对——我从来没有完全相信让工具修改自己的描述和命名空间的想法。我只使用 roxygen2 来生成 Rd 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2017-08-02
      相关资源
      最近更新 更多