我正在撰寫一個 Rcpp 包,其中包含非侵入式匯出到 C 型別的基本 Rcpp 物件的類(參見Eddelbuettel 和 Francois 的擴展 Rcpp,以及coatless 的這個有用的小插圖)。
這意味著如果我有一個類foo::bar和一個foo::bar給定 a的建構式SEXP,我可以呼叫這樣的函式:
//[[Rcpp::export]]
void func(foo::bar object){
// do something
}
我的問題是sourceCpp("foobar.cpp")完全按預期作業,但R CMD build抱怨RcppExports.cpp檔案缺少這個新類的宣告。
這是一個最小的可重現示例,包含一個foo::bar持有單個Rcpp::NumericVector. 它編譯sourceCpp()但包不會構建,因為foobar在RcppExports.cpp以下位置找不到:
foob??ar.cpp:
#include <RcppCommon.h>
// forward declare class
namespace foo {
class bar;
}
// forward declare Rcpp::as<> Exporter
template <>
class Rcpp::traits::Exporter<foo::bar>;
#include <Rcpp.h>
// now fully declare class, since Rcpp objects
// are now loaded from Rcpp.h
namespace foo {
class bar {
public:
Rcpp::NumericVector x;
bar(Rcpp::NumericVector x) : x(x) {};
};
}
// now fully declare Rcpp exporter, since we can
// deal with Rcpp objects from Rcpp.h
namespace Rcpp {
namespace traits {
template <>
class Exporter<foo::bar> {
Rcpp::NumericVector x_;
public:
Exporter(SEXP x) : x_(x) {}
foo::bar get() {
return foo::bar(x_);
}
};
}
}
//[[Rcpp::export]]
Rcpp::NumericVector test(foo::bar& A) {
return A.x;
}
我在運行時遇到的具體錯誤R CMD check都在src/RcppExports.cpp檔案中:
- 'foo' 尚未宣告
- 'A' 未在此范圍內宣告
- 'foo' 未在此范圍內宣告
- '模板引數 1 無效
- 'A' 之前宣告中的 'qualified-id
需要做什么才能讓包像構建一樣sourceCpp?
感謝您提供任何解決方案!
uj5u.com熱心網友回復:
RcppExports.cpp 檔案缺少此新類的宣告。
請參閱屬性小插圖。自定義行為是將標題命名為包(即foo.h包foo)和/或foo-types.h),它將添加到生成的RcppExports.cpp.
這是記錄在案但隱藏的太有效了:-/它也在這里,所以我們可以將其作為騙子關閉,但我現在沒有時間搜索它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/347586.html
上一篇:找出與回應最相關的5個變數
