gpt4 book ai didi

rcpp - 使用 RcppArmadillo 时无法使用 devtools 构建 R 包

转载 作者:行者123 更新时间:2023-12-04 14:25:53 31 4
gpt4 key购买 nike

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

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

例如,我有一个(希望非常小 + 完整)测试版本的包,我正在尝试在此处开发:https://github.com/suztolwinskiward/fooR/ . fooR 只包含一个函数,它是来自 fields 包的 rdist.earth 函数的 C++ 实现。

运行 devtools::document("fooR") 会吐出大量消息(几个暗指“ undefined reference ”到不存在于我的源代码中的变量,我无法解释,然后失败:

    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 的方式有问题,但我无法弄清楚是什么。任何建议非常感谢!

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

最佳答案

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

关于rcpp - 使用 RcppArmadillo 时无法使用 devtools 构建 R 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33395264/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com