<commit_before>---
layout: post
title: Rcpp读书笔记：第一章Rcpp简介
categories: Rcpp R C++
description: 第一章Rcpp简介.
keywords: Rcpp, C++, R, markdown
---

1.1 背景：从R到C++
------------------

R语言是从S语言进化来的，R和S语言近三十年来一直在进化。举例说明，R语言通过S3和S4类系统实现面向对象特性，也包括新的参考类(reference class)。这种进化，有时候让新手看起来更加复杂（perplexing），也会让中高级开发者感觉语言特性的不连续。巧合的是（Coincidentally），C++也存在同样的问题。

这些争论听起来有些道理，但实际上不是那么回事。人们更加关心语言的可用性。一个语言的关键特性是，可以**再现**整个数据分析过程。

下边是一个例子,数据来自美国黄石公园老忠实喷泉（Old Faithful Geyser）的喷发和等待时间。喷发时间的密度函数曲线见下图。

``` R
xx <- faithful$eruptions
fit <- density(xx)
plot(fit)
```

![图1 老忠实泉喷发时间密度曲线](/images/2017-06-07-Rcpp-Chapter1-Notes_files/figure-markdown_github/simpleR-1.png)

语言完美的展示了R的面向对象特性，利用plot函数，可以直接对函数density的返回结果**fit**进行图形绘制。

接下来展示的代码，说实话没怎么看懂。

```r
xx <- faithful$eruptions
fit1 <- density(xx)
fit2 <- replicate(10000,
                  {
                    x <- sample(xx, replace = TRUE)
                    density(x, from = min(fit1$x), to = max(fit1$x))$y
                  })
fit3 <- apply(fit2, 1, quantile, c(0.025, 0.975))
plot(fit1, ylim = range(fit3))
polygon(c(fit1$x, rev(fit1$x)),
        c(fit3[1, ], rev(fit3[2, ])),
        col = 'grey',
        border = F)
lines(fit1)
```

![图2 Bootstrap 置信区间](/images/2017-06-07-Rcpp-Chapter1-Notes_files/figure-markdown_github/bootstrap-1.png)

3-6行执行一个最小型的bootstrap抽样。replicate函数对第二个参数重复了10000次。 第二个参数是一个代码段，包含了2个命令。

```r
x <- sample(xx,replace=TRUE);
```

第一个命令，主要是进行重复抽样，构建一个新的数据集，主要是次序不一样。 第二个命令密度函数。其他就看不下去了，应该要看一下bootstrap的原理才会明白。

R内部执行的关键是它的核心解释器，扩展机制通过C语言执行。C语言的关键特性是可扩展性，通过外部库和外部模块完成。Rcpp的主要优势是，可以替代C，快速的写R的扩展。

1.2 第一个例子<commit_msg>modify fig directory<commit_after>---
layout: post
title: Rcpp读书笔记：第一章Rcpp简介
categories: Rcpp R C++
description: 第一章Rcpp简介.
keywords: Rcpp, C++, R, markdown
---

1.1 背景：从R到C++
------------------

R语言是从S语言进化来的，R和S语言近三十年来一直在进化。举例说明，R语言通过S3和S4类系统实现面向对象特性，也包括新的参考类(reference class)。这种进化，有时候让新手看起来更加复杂（perplexing），也会让中高级开发者感觉语言特性的不连续。巧合的是（Coincidentally），C++也存在同样的问题。

这些争论听起来有些道理，但实际上不是那么回事。人们更加关心语言的可用性。一个语言的关键特性是，可以**再现**整个数据分析过程。

下边是一个例子,数据来自美国黄石公园老忠实喷泉（Old Faithful Geyser）的喷发和等待时间。喷发时间的密度函数曲线见下图。

``` R
xx <- faithful$eruptions
fit <- density(xx)
plot(fit)
```

![图1 老忠实泉喷发时间密度曲线](/images/2017-06-07-Rcpp-Chapter1-Notes_files/figure-html/simpleR-1.png)

语言完美的展示了R的面向对象特性，利用plot函数，可以直接对函数density的返回结果**fit**进行图形绘制。

接下来展示的代码，说实话没怎么看懂。

```r
xx <- faithful$eruptions
fit1 <- density(xx)
fit2 <- replicate(10000,
                  {
                    x <- sample(xx, replace = TRUE)
                    density(x, from = min(fit1$x), to = max(fit1$x))$y
                  })
fit3 <- apply(fit2, 1, quantile, c(0.025, 0.975))
plot(fit1, ylim = range(fit3))
polygon(c(fit1$x, rev(fit1$x)),
        c(fit3[1, ], rev(fit3[2, ])),
        col = 'grey',
        border = F)
lines(fit1)
```

![图2 Bootstrap 置信区间](/images/2017-06-07-Rcpp-Chapter1-Notes_files/figure-html/bootstrap-1.png)

3-6行执行一个最小型的bootstrap抽样。replicate函数对第二个参数重复了10000次。 第二个参数是一个代码段，包含了2个命令。

```r
x <- sample(xx,replace=TRUE);
```

第一个命令，主要是进行重复抽样，构建一个新的数据集，主要是次序不一样。 第二个命令密度函数。其他就看不下去了，应该要看一下bootstrap的原理才会明白。

R内部执行的关键是它的核心解释器，扩展机制通过C语言执行。C语言的关键特性是可扩展性，通过外部库和外部模块完成。Rcpp的主要优势是，可以替代C，快速的写R的扩展。

1.2 第一个例子
{'fraction_non_alphanumeric': 0.16101426307448494, 'fraction_numerical': 0.04120443740095087, 'mean_word_length': 4.585840707964602, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4878606', 'n_tokens_mistral': 1972, 'n_tokens_neox': 2085, 'n_words': 163}