6

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

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

例如,我在这里尝试开发的包的(希望非常小+完整)测试版本:https ://github.com/suztolwinskiward/fooR/ 。fooR 仅包含一个函数,它是 fields 包中 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 的方式有问题,但我无法弄清楚是什么。非常感谢任何建议!

PS 我很惊讶这里没有 RcppArmadillo 标签....

4

4 回答 4

6

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

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

# 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.package.skeleton()由 RcppArmadillo 0.6.700.6.0 生成的命名空间相同。

于 2016-05-19T12:49:24.163 回答
3

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

useDynLib(fooR)
exportPattern("^[[:alpha:]]+")
于 2015-10-28T16:24:37.203 回答
1

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

于 2015-10-29T20:57:01.477 回答
0

'devtools::document()' 编译你的代码,老实说,我不知道为什么。这意味着如果编译失败,文档就没有完成。在您的情况下,这似乎意味着您没有写下您的 NAMESPACE。

按照 Dirk 的建议开始,然后添加一些东西,但它必须在文档完成之前编译。

于 2015-10-28T20:24:58.807 回答