C++ 在C+中重写慢R函数+&;Rcpp

C++ 在C+中重写慢R函数+&;Rcpp,c++,r,vector,rcpp,C++,R,Vector,Rcpp,我有这行R代码: croppedDNA <- completeDNA[,apply(completeDNA,2,function(x) any(c(FALSE,x[-length(x)]!=x[-1])))] crappeddna样本数据: set.seed(123) z <- matrix(sample(c("a", "t", "c", "g", "N", "-"), 3*398508, TRUE), 3, 398508) P>很可能C++会打败它,但它真的是必要的吗?< /

我有这行R代码:

croppedDNA <- completeDNA[,apply(completeDNA,2,function(x) any(c(FALSE,x[-length(x)]!=x[-1])))]
crappeddna样本数据:

set.seed(123)
z <- matrix(sample(c("a", "t", "c", "g", "N", "-"), 3*398508, TRUE), 3, 398508)

<> P>很可能C++会打败它,但它真的是必要的吗?< /P>好的开始,但是你不能在C/C++中使用否定索引…@ DrkdDelbuteltter,是的,你可以,提供你使用它的任何东西,从数组中间开始,或者重载它来处理否定。例如,
intarr[]={1,2,3,4,5};int*mid=&arr[2];int x=中间[-1]//x=2
能否确认
类(completeDNA)
矩阵
而不是
数据帧
<代码>应用是缓慢的,在跳转到C++之前可能会对R代码做一些简单的改进。这是分裂毛发。索引从0到n-1,索引开始(几乎总是)在与您正在索引的“事物”的开始相对应的位置。是的,completeDNA属于矩阵类,由“类(completeDNA)”确认。这太棒了,我认为求和很快,因为向量化R很擅长。我将接受这一点作为我将在管道中使用的代码的答案。我会去C++,但真正的是我自己的教育。谢谢你,弗洛德尔!(+1)在盒子里思考:-)
set.seed(123)
z <- matrix(sample(c("a", "t", "c", "g", "N", "-"), 3*398508, TRUE), 3, 398508)
system.time(y1 <- z[,apply(z,2,function(x) any(c(FALSE,x[-length(x)]!=x[-1])))])
#    user  system elapsed 
#   4.929   0.043   4.976 
system.time(y2 <- (z[, colSums(z[-1,] != z[-nrow(z), ]) > 0]))
#    user  system elapsed 
#   0.087   0.011   0.098 
identical(y1, y2)
# [1] TRUE