【问题标题】:add and Rcpp file to an existing r Package?将 Rcpp 文件添加到现有的 r 包?
【发布时间】:2021-01-26 01:07:54
【问题描述】:

我已经制作了一个简单的 R 包(纯 R)来解决蛮力问题,然后我尝试通过编写 Rcpp 脚本来加快代码速度。我编写了一个脚本来将运行时间与“bench”库进行比较。现在,如何将此脚本添加到我的包中?我尝试添加

#'@importFrom Rcpp cppFunction 

在我的 R 脚本之上并在 scr 文件夹中插入 Rcpp 文件但没有用。有没有办法将它添加到我的 r 包中而无需从头开始创建包?对不起,如果它已经被问过了,但我对这一切都很陌生并且完全迷失了。

【问题讨论】:

标签: r package rcpp roxygen2


【解决方案1】:

这种转换实际上(仍然)非常困难(在需要不止一个文件的意义上)。很容易忽略细节。让我告诉你为什么。

让我们假设您使用 R 包package.skeleton() 启动了一个工作包。这是最简单和最普遍的情况。该程序包将起作用(但有警告,请参阅我的 pkgKitten 程序包以获取比清理的包装程序,以及 CRAN 上的十几个其他程序包帮助功能和程序包)。请特别注意,我对roxygen2 只字未提,这只是一个额外的复杂因素,所以让我们只关注.Rd 文件。

您现在可以将最简单的包与Rcpp 构建的包进行对比,即使用Rcpp.package.skeleton()。你会至少

中看到这些差异
  • DESCRIPTION 代表 LinkingTo:Imports
  • NAMESPACE 代表 importFrom 以及 useDynLib
  • 一个新的src 目录和可能需要src/Makevars

所有这些都使(基本上)通过Rcpp.package.skeleton() 启动新包并将现有包代码复制到该包中变得更容易。我们根本没有转换助手。我仍然会时不时地进行您尝试的“手动转换”,甚至我需要一两次尝试,并且我已经多次看到所有错误消息......

因此,即使您不想“复制所有内容”,我认为最简单的方法是

  • 创建 两个 带有和不带有 Rcpp 的包
  • 做一个递归diff
  • 确保差异应用在您的原始包中。

PS 请记住,当您使用roxygen2 并在src/ 目录中有文档时,始终首先运行Rcpp::compileAttributes(),然后再运行roxygen2::roxygenize()。 RStudio 和其他助手会为您做到这一点,但仍然很容易忘记......

【讨论】:

  • 很高兴能帮上忙。还有其他的辅助包装器(我自己写了一些),但我觉得除了随意使用之外,知道和理解发生了什么很重要。并且从小而完整的示例中工作就可以做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多