我想使用Rcpp访问整数向量中第二个唯一元素的值,但是我得到一个零向量,其长度等于整数向量中第二个项的值。我做错了什么?
require(Rcpp)
cppFunction("NumericVector test(IntegerVector labelling1) {
IntegerVector lvls = unique(labelling1);
return(lvls[1]);
}")
test(1:5)
#[1] 0 0
答案 0 :(得分:2)
这里实际上有一个单独的问题:您正在尝试从NumericVector
构建int
,而Rcpp会执行以下操作:
2
NumericVector
构造为NumericVector(2)
;即长度为2的NumericVector
。如果您真正想要的是表示该索引值的IntegerVector
,则必须写:
IntegerVector test(IntegerVector labelling1) {
IntegerVector lvls = unique(labelling1);
return IntegerVector::create(lvls[1]);
}
或者您也可以使用Rcpp属性(自动处理从int
到IntegerVector
的转换):
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int test(IntegerVector labelling1) {
IntegerVector lvls = unique(labelling1);
return lvls[1];
}
/*** R
test(1:5)
*/
答案 1 :(得分:1)
子集糖需要IntegerVector
作为索引(http://gallery.rcpp.org/articles/subsetting/)。如果您想模仿R unique
函数,则需要进行一些其他更改:
cppFunction("IntegerVector test(IntegerVector labelling1, int i) {
// get sorted unique values
IntegerVector lvls = sort_unique(labelling1);
// get unique values in order of occurence
IntegerVector lvls1 = lvls[match(lvls, labelling1) - 1];
return(lvls1[IntegerVector::create(i - 1)]);}")
test(c(5:1, 1L), 2)
#[1] 4