使用RcppArmadillo

时间:2015-10-28 15:34:04

标签: rcpp armadillo devtools r-package

这是我的第一个stackoverflow问题,所以请善待,伙计们!

我非常高兴我最近发现使用devtools构建R软件包的能力。但是,一旦我尝试构建一个使用RcppArmadillo的包,我运行devtools :: document(),devtools :: check()和devtools :: build()的工作流程就不再有效了。

例如,我有一个(希望非常小的+完整的)测试版本的测试版本我试图在这里开发:https://github.com/suztolwinskiward/fooR/。 fooR只包含一个函数,它是字段包中rdist.earth函数的C ++实现。

运行devtools :: document(" fooR")会发出大量消息(有些消息指向"未定义的引用"对于不存在于我的源代码中的不可解释的变量对我来说,然后失败了:

    collect2: ld returned 1 exit status
    no DLL was created
    ERROR: compilation failed for package 'fooR'
    * removing 'C:/Users/I53794/AppData/Local/Temp/RtmpWgC8nD/devtools_install_1ea473123086/fooR'
    Error: Command failed (1)

另一方面,当我获取依赖于RcppArmadillo的C ++函数时,它似乎运行得很好:

> Rcpp::sourceCpp('./src/rdist_earth_cpp.cpp')
> data('miami')
> data('new_orleans','katrina_path')
> rdist_earth_cpp(katrina_path,new_orleans)
            [,1]
 [1,] 1042.36073
 [2,]  998.96793
 [3,]  957.69315
 [4,]  917.91486
 [5,]  868.07791
 [6,]  805.73485
 [7,]  763.01476
 [8,]  726.10133
 [9,]  692.14482
[10,]  670.15133
[11,]  662.23353
[12,]  625.55592
[13,]  601.08682
[14,]  579.73940
[15,]  560.32660
[16,]  539.14192
[17,]  510.15438
[18,]  481.40037
[19,]  442.52322
[20,]  391.96619
[21,]  331.66378
[22,]  271.79088
[23,]  201.24749
[24,]  128.12647
[25,]   56.99198
[26,]   45.80297
[27,]   32.96609
[28,]   81.71237
[29,]  189.31050
[30,]  296.92104
[31,]  406.12593
[32,]  516.08458
[33,]  654.81113
[34,]  808.21670

这让我觉得我试图在我的包裹中使用RcppArmadillo的方式有问题,但我还没有弄明白什么。任何建议都非常感谢!

P.S。我很惊讶,这里没有RcppArmadillo标签....

4 个答案:

答案 0 :(得分:4)

除了jtilly的回答和Dirk的评论:

RcppArmadillo.package.skeleton()生成正确的命名空间文件,但在通过document()运行roxygen2后,命名空间只包含一行

# Generated by roxygen2: do not edit by hand

并覆盖DynLib / export指令。要让roxygen2自动生成正确的命名空间,请将新的R文件添加到包目录的R子目录中,其中包含以下内容:

#' @useDynLib YourPackageName
#' @importFrom Rcpp evalCpp
#' @exportPattern "^[[:alpha:]]+"
NULL

此文件的名称并不重要,但YourPackageName.r通常用于此(种类)"主文件"。

运行" document()"时,会生成以下命名空间文件:

# Generated by roxygen2: do not edit by hand

exportPattern("^[[:alpha:]]+")
importFrom(Rcpp,evalCpp)
useDynLib(YourPackageName)

这是由RcppArmadillo 0.6.700.6.0通过RcppArmadillo.package.skeleton()生成的相同名称空间。

答案 1 :(得分:3)

您的NAMESPACE文件为空。它应该包含这样的内容:

<div>

答案 2 :(得分:1)

最终工作的是用RcppArmadillo.skeleton.package初始化一个新包,将我以前的所有文件移到其中,手动记录文档,然后使用RStudio中的GUI按钮进行检查和构建。这感觉非常糟糕,我真的很喜欢使用roxygen2更好的文档 - 但作为RcppAmadillo依赖的包开发的相对新手,我很高兴现在已经找到了成功构建的方法!

答案 3 :(得分:0)

&#39; devtools ::文件()&#39;编译你的代码,老实说,我不知道为什么。这意味着如果编译失败,则文档尚未完成。在你的情况下,这似乎意味着你不会写你的NAMESPACE。

从Dirk的建议开始,添加内容,但必须在文档完成之前进行编译。