【发布时间】:2013-04-11 16:12:09
【问题描述】:
我会编写一个函数(使用Rcpp),从R 向量中删除所有NA 值。
在这样做之前,我通过Rcpp::cppFunction函数做了一个小测试。
library(inline)
cppFunction('
Vector<INTSXP> na_test(const Vector<INTSXP>& x) {
return setdiff(x, Vector<INTSXP>::create(::traits::get_na<INTSXP>()));
}
')
这样工作:
na_test(c(1, NA, NA, 1, 2, NA))
# [1] 1 2
之后我尝试通过C++模板机制来泛化这个函数。
所以,在一个外部 .cpp 文件(来自sourceCpp 函数)中,我写了:
template <int RTYPE>
Vector<RTYPE> na_test_template(const Vector<RTYPE>& x) {
return setdiff(x, Vector<RTYPE>::create(::traits::get_na<RTYPE>()));
}
// [[Rcpp::export(na_test_cpp)]]
SEXP na_test(SEXP x) {
switch(TYPEOF(x)) {
case INTSXP:
return na_test_template<INTSXP>(x);
case REALSXP:
return na_test_template<REALSXP>(x);
}
return R_NilValue;
}
这段代码编译但行为不同,我无法解释原因。
事实:
na_test_cpp(c(1, NA, NA, 1, 2, NA))
# [1] 2 NA NA NA 1
为什么相同的函数(显然)表现不同?这里发生了什么?
【问题讨论】:
-
您的示例调用了 na_test_cpp,您的代码没有显示。
-
这个表达式
// [[Rcpp::export(na_test_cpp)]]不需要导出函数(用想要的名字)? -
我的错,忽略了它