使用 RcppArmadillo 时无法使用 devtools 构建 R 包
Trouble building R package wtih devtools when it uses RcppArmadillo
这是我的第一个 Whosebug 问题,请大家多多关照!
我非常享受最近发现的使用 devtools 构建 R 包的能力。但是,一旦我尝试构建一个使用 RcppArmadillo 的包,我的 运行ning devtools::document()、devtools::check() 和 devtools::build() 工作流程就不再有效.
例如,我有一个(希望是非常小的 + 完整的)我正在尝试开发的包的测试版本:https://github.com/suztolwinskiward/fooR/。 fooR 只包含一个函数,它是 fields 包中 rdist.earth 函数的 C++ 实现。
运行 devtools::document("fooR") 吐出很多消息(有几条暗示 "undefined references" 不存在于我的源代码中的无法解释的变量对我来说,然后失败了:
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 标签....
您的 NAMESPACE 文件是空的。它应该包含如下内容:
useDynLib(fooR)
exportPattern("^[[:alpha:]]+")
'devtools::document()' 编译您的代码,老实说,我不确定为什么。这意味着如果编译失败,文档就不会完成。在您的情况下,这似乎意味着您没有写入 NAMESPACE。
按照德克的建议开始,并添加内容,但必须在文档完成之前进行编译。
最终起作用的是用 RcppArmadillo.skeleton.package 初始化一个新包,将我以前的所有文件移到其中,手动记录,然后使用 RStudio 中的 GUI 按钮检查和构建。这感觉很笨拙,我真的很喜欢使用 roxygen2 更好地编写文档——但作为依赖 RcppAmadillo 的包开发的相对新手,我很高兴现在找到了一种成功构建的方法!
除了 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
通常用于此(某种)"main file"。
当运行"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()
生成的命名空间相同。
这是我的第一个 Whosebug 问题,请大家多多关照!
我非常享受最近发现的使用 devtools 构建 R 包的能力。但是,一旦我尝试构建一个使用 RcppArmadillo 的包,我的 运行ning devtools::document()、devtools::check() 和 devtools::build() 工作流程就不再有效.
例如,我有一个(希望是非常小的 + 完整的)我正在尝试开发的包的测试版本:https://github.com/suztolwinskiward/fooR/。 fooR 只包含一个函数,它是 fields 包中 rdist.earth 函数的 C++ 实现。
运行 devtools::document("fooR") 吐出很多消息(有几条暗示 "undefined references" 不存在于我的源代码中的无法解释的变量对我来说,然后失败了:
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 标签....
您的 NAMESPACE 文件是空的。它应该包含如下内容:
useDynLib(fooR)
exportPattern("^[[:alpha:]]+")
'devtools::document()' 编译您的代码,老实说,我不确定为什么。这意味着如果编译失败,文档就不会完成。在您的情况下,这似乎意味着您没有写入 NAMESPACE。
按照德克的建议开始,并添加内容,但必须在文档完成之前进行编译。
最终起作用的是用 RcppArmadillo.skeleton.package 初始化一个新包,将我以前的所有文件移到其中,手动记录,然后使用 RStudio 中的 GUI 按钮检查和构建。这感觉很笨拙,我真的很喜欢使用 roxygen2 更好地编写文档——但作为依赖 RcppAmadillo 的包开发的相对新手,我很高兴现在找到了一种成功构建的方法!
除了 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
通常用于此(某种)"main file"。
当运行"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()
生成的命名空间相同。