Suz*_*ard 6 devtools armadillo rcpp r-package
这是我的第一个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)
Run Code Online (Sandbox Code Playgroud)
另一方面,当我获取依赖于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
Run Code Online (Sandbox Code Playgroud)
这让我觉得我试图在我的包中使用RcppArmadillo的方式有问题,但我无法弄清楚是什么.任何建议非常感谢!
PS我很惊讶这里没有RcppArmadillo标签....
除了 jtilly 的回答和 Dirk 的评论:
RcppArmadillo.package.skeleton()生成正确的命名空间文件,但通过document()命名空间运行 roxygen2 后只包含一行
# Generated by roxygen2: do not edit by hand
Run Code Online (Sandbox Code Playgroud)
并且 DynLib/export 指令被覆盖。要让 roxygen2 自动生成正确的命名空间,请在包目录的 R 子目录中添加一个新的 R 文件,其中包含以下内容:
#' @useDynLib YourPackageName
#' @importFrom Rcpp evalCpp
#' @exportPattern "^[[:alpha:]]+"
NULL
Run Code Online (Sandbox Code Playgroud)
该文件的名称无关紧要,但YourPackageName.r对于这种(某种)“主文件”来说很常见。
运行“document()”时,会生成以下命名空间文件:
# Generated by roxygen2: do not edit by hand
exportPattern("^[[:alpha:]]+")
importFrom(Rcpp,evalCpp)
useDynLib(YourPackageName)
Run Code Online (Sandbox Code Playgroud)
这与RcppArmadillo.package.skeleton()由 RcppArmadillo 0.6.700.6.0生成的命名空间相同。