典型的Rcpp编辑-编译-测试周期如何?

时间:2018-07-04 12:47:09

标签: r rcpp

我只能找到有关如何安装现成的R扩展程序包的信息,但没有提及在开发过程中必须命令扩展程序包开发人员在日常开发中使用的信息。我正在使用Rcpp,并且在Windows上。

如果这是一个典型的C ++项目,它将像这样:

edit
make  # oops, typo
edit  # fix typo
make  # oops, forgot an #include
edit
make  # good; updates header dependencies for subsequent 'make' automatically
./fooreader  # test it
make install # only now I'm ready

Rcpp软件包项目的日常开发需要哪些命令?

我已经从R命令行使用以下命令分配了一个骨架项目:

library(Rcpp)
Rcpp.package.skeleton("FooReader", example_code=FALSE,
         author="My Name", email="my.email@example.com")

这分配了3个文件:

DESCRIPTION
NAMESPACE
man/FooReader-package.Rd

现在我将源代码放入

src/readfoo.cpp

具有以下内容:

#include <Rcpp.h>

#error here

我知道我可以从R命令行运行它:

Rcpp::sourceCpp("D:/Projects/FooReader/src/readfoo.cpp")

(这会运行编译器并指示#error)。 但我最终想开发一个程序包。

2 个答案:

答案 0 :(得分:2)

我想每个人都没有一个统一的答案。

对于某些人来说,RStudio就是一切,而且出于某种原因。可以使用程序包创建工具来创建Rcpp程序包,然后进行编辑,然后单击按钮(或键盘快捷键)进行编译,重新加载和测试。

我在shell上也做很多工作,所以我在Emacs / ESS中与R CMD INSTALL(其中要感谢ccache重新编译未修改的代码立即进行)一起在命令中进行了大量的编辑-通过littler软件包的r行使用-这使我可以编写紧凑的表达式来加载新软件包并进行评估:r -lnewpackage -esomeFunc(somearg)newpackage::someFunc()测试somearg
您也可以从Emacs启动构建并进行测试。正如我所说,这一切都取决于。

这两个答案都是针对包裹的,我在其中工作。当我只在单个文件中测试某些内容时,我在一个Emacs缓冲区中执行该操作,并在同一会话的另一个Emacs中的R会话中执行sourceCpp()。或者有时我在Emacs中编辑并在RStudio中运行sourceCpp()

没有一个答案。找到适合您的东西。

此外,问题的第一部分描述了软件包的初始设置。那不是一次性的编辑/编译/链接/测试周期的一部分。为此,我们也有不同的方法,此处讨论了许多方法。

编辑:您对问题的另一个主要误解是一旦您拥有软件包,您通常就不使用{{1 }}

答案 1 :(得分:1)

为了测试R软件包,必须将其安装到(临时)库中,以便可以将其附加到正在运行的R进程中。因此,您通常需要:

  • R CMD build .构建package_version.tar.gz
  • R CMD check <package_version.tar.gz>来测试您的程序包,包括放在tests文件夹中的测试
  • R CMD INSTALL <package_version.tar.gz>将其安装到库中

之后,您可以连接包装并进行测试。我经常尝试使用更多的TTD方法,这意味着我不必INSTALL打包。运行单元测试(例如通过R CMD check)就足够了。

所有独立于Rcpp的东西。对于使用Rcpp的软件包,您需要在执行这些步骤之前调用Rcpp::compileAttributes(),例如与Rscript -e 'Rcpp::compileAttributes()'

如果您使用RStudio进行程序包开发,它会通过devtools程序包提供很多自动化功能。我仍然发现了解引擎盖下必须执行的操作很有用,而且绝不是必须的。