6

これは私の最初のスタックオーバーフローの質問です。

私は、devtools を使用して R パッケージを構築する能力を最近発見したことを大いに楽しんでいます。しかし、RcppArmadillo を使用するパッケージをビルドしようとすると、devtools::document()、devtools::check()、および devtools::build() を実行するワークフローが機能しなくなります。

たとえば、ここで開発しようとしているパッケージの (できればかなり最小限で完全な) テスト バージョンがあります: https://github.com/suztolwinskiward/fooR/。fooR には、fields パッケージの rdist.earth 関数の C++ 実装である関数が 1 つだけ含まれています。

devtools::document("fooR") を実行すると、多くのメッセージが吐き出されます (いくつかは、ソース co に存在せず、解釈できない変数への「未定義の参照」をほのめかし、失敗します:

    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()1 行だけが含まれます。

# 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 に答える
1

最終的にうまくいったのは、RcppArmadillo.skeleton.package で新しいパッケージを初期化し、以前のすべてのファイルをそこに移動し、手動で文書化してから、RStudio の GUI ボタン​​でチェックしてビルドすることでした。これはかなりぎこちなく感じます。ドキュメンテーションには roxygen2 を使用する方がはるかに優れています。

于 2015-10-29T20:57:01.477 に答える
0

「devtools::document()」はコードをコンパイルします。正直なところ、理由はわかりません。これは、コンパイルが失敗した場合、ドキュメントが完成しないことを意味します。あなたの場合、これは NAMESPACE が書かれていないことを意味しているようです。

Dirk が提案するように開始し、何かを追加しますが、ドキュメントが完成する前にコンパイルする必要があります。

于 2015-10-28T20:24:58.807 に答える