我有一个数字矢量列表,并且我需要一个唯一元素列表。我尝试了Rcpp:unique
功能。当应用于Numeric Vector
但不适用于List
时,它的效果很好。这是代码,也是我得到的错误。
List h(List x){
return Rcpp::unique(x);
}
dyn.load中的错误(“ /tmp/RtmpDdKvcH/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_272635d5289/sourceCpp_10.so”): 无法加载共享对象'/tmp/RtmpDdKvcH/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_272635d5289/sourceCpp_10.so': /tmp/RtmpDdKvcH/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_272635d5289/sourceCpp_10.so:未定义符号:_ZNK4Rcpp5sugar9IndexHashILi19EE8get_addrEP7SEXPREC
答案 0 :(得分:0)
目前尚不清楚您在做什么错,这是一个不完整/无法再现的问题。
但是有一个单元测试可以完成您的工作,我们也可以手动进行:
R> Rcpp::cppFunction("NumericVector uq(NumericVector x) { return Rcpp::unique(x); }")
R> uq(c(1.1, 2.2, 2.2, 3.3, 27))
[1] 27.0 1.1 3.3 2.2
R>
答案 1 :(得分:0)
即使没有匹配的Rcpp sugar函数,也可以从C ++中调用R函数。示例:
#include <Rcpp.h>
using namespace Rcpp;
Rcpp::Environment base("package:base");
Function do_unique = base["unique"];
// [[Rcpp::export]]
List myfunc(List x) {
return do_unique(x);
}
答案 2 :(得分:0)
感谢您对此问题感兴趣。
如我所知,我的List
仅包含NumericVector
。我提出的这段代码比unique
中的R
函数运行得更好而且运行更快。但是,当列表很大时,其效率会降低。也许这可以帮助某人。而且,有人也可以优化此代码。
List uniqueList(List& x) {
int xsize = x.size();
List xunique(x);
int s = 1;
for(int i(1); i<xsize; ++i){
NumericVector xi = x[i];
int l = 0;
for(int j(0); j<s; ++j){
NumericVector xj = x[j];
int xisize = xi.size();
int xjsize = xj.size();
if(xisize != xjsize){
++l;
}
else{
if((sum(xi == xj) == xisize)){
goto notkeep;
}
else{
++l;
}
}
}
if(l == s){
xunique[s] = xi;
++s;
}
notkeep: 0;
}
return head(xunique, s);
}
/***R
x <- list(1,42, 1, 1:3, 42)
uniqueList(x)
[[1]]
[1] 1
[[2]]
[1] 42
[[3]]
[1] 1 2 3
microbenchmark::microbenchmark(uniqueList(x), unique(x))
Unit: microseconds
expr min lq mean median uq max neval
uniqueList(x) 2.382 2.633 3.05103 2.720 2.8995 29.307 100
unique(x) 2.864 3.110 3.50900 3.254 3.4145 24.039 100
但是当R
较大时,List
函数将变得更快。我确信有人可以优化此代码。