开始使用免费开始使用

STL 向量

标准模板库(stl)是一个包含灵活算法和数据结构的 C++ 库。比如,stl 中的 double 向量就是 Rcpp 的 NumericVector 在"原生 C++"中的等价物。下面的代码创建了一个包含 10 个元素、名为 x 的标准 double 向量。

std::vector<double> x(10);

通常,更适合坚持使用 Rcpp 的向量类型,因为它能让您使用许多与 R 等价且便捷的方法,包括 mean()round()abs()。不过,stl 向量的一个优势是:它们可以动态改变大小,而且每次无需为数据拷贝付出开销。这使我们能够像上一练习中的"bad"函数那样编写更简单的代码,同时保持与"good"代码相当的性能。

本练习是课程的一部分

用 Rcpp 优化 R 代码

查看课程

练习说明

  • 完成 select_positive_values_std() 的定义,这是一个基于 stl 向量的正数筛选函数。
    • 将函数的返回类型设为标准 double 向量,即 std::vector<double>
    • 定义一个大小为 0 的标准 double 向量 positive_x
    • for 循环的 if 代码块中,使用 positive_xpush_back()x 的第 i 个元素追加进去。
  • 为便于对比,上一练习中的 good_select_positive_values_cpp() 已在您的工作区可用。请查看控制台输出,了解这两个函数的相对速度。

交互式实操练习

通过完成这段示例代码来试试这个练习。

#include 
using namespace Rcpp;

// Set the return type to a standard double vector
// [[Rcpp::export]]
___ select_positive_values_std(NumericVector x) {
  int n = x.size();
  
  // Create positive_x, a standard double vector
  ___;
    
  for(int i = 0; i < n; i++) {
    if(x[i] > 0) {
      // Append the ith element of x to positive_x
      ___;
    }
  }
  return positive_x;
}

/*** R
set.seed(42)
x <- rnorm(1e6)
# Does it give the same answer as R?
all.equal(select_positive_values_std(x), x[x > 0])
# Which is faster?
microbenchmark(
  good_cpp = good_select_positive_values_cpp(x),
  std = select_positive_values_std(x)
)
*/
编辑并运行代码