-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path09-rpackages.Rmd
More file actions
171 lines (117 loc) · 4.73 KB
/
09-rpackages.Rmd
File metadata and controls
171 lines (117 loc) · 4.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# Création de package avec Rstudio {#packages}
## Introduction
L'objectif de ce petit tutoriel est
1. de créer un projeet `package` sous Rstudio (avec le package `devtools` [@R-devtools]),
2. de se familiariser avec les outils de documentation,
3. d'intégrer un code `C++`,
4. de déposer un package sur github.
## Création d'un package rudimentaire
Supposons qu'on dispose de la fonction
```{r simple-OLS, echo=TRUE}
OLS <- function(X,y) {
beta.hat <- chol2inv(chol(crossprod(X))) %*% crossprod(X,y)
beta.hat
}
```
### Exercice 1
Créer un projet package via Rstudio:
> File -> New Project -> New Directory -> New Package with git repository
Vous pouvez également utiliser directement la commande
```{r, eval=FALSE, echo=TRUE}
devtools::create("OLSfit")
```
### Exercice 2
Effacer le fichier `hello.R`. Créer un fichier `OLS.R` contenant votre fonction.
### Exercice 3
Éditer le fichier `DESCRIPTION` de manière adéquate: modifier le titre, le nom de l'auteur, du mainteneur, la description. Pour le nom de l'auteur, utiliser
```{r, eval=FALSE, echo=TRUE}
person("First", "Last", email = "first.last@example.com", role = c("aut", "cre"))
```
### Exercice 4
Documentez la fonction `OLS` à l'aide de `Roxygen2` [@R-roxygen2] : pour ce faire, complétez le code suivant et collez-le dans l'entête de votre fichier `OLS.R`. La balise `@export` indique que cette fonction doit être rendue public à l'utilisateur. Lors de la compilation de la documentation, le fichier `NAMESPACE` sera amendé en ce sens.
#### Question {-}
```{r roxygen2}
#' Description of the function
#'
#' @param a paramter
#' @return what is returned
#' @examples
#' @export
OLS <- function(X,y) {
beta.hat <- chol2inv(chol(crossprod(X))) %*% crossprod(X,y)
beta.hat
}
```
#### Solution {-}
```{r roxygen2-solution}
#' Compute the OLS esstimator
#'
#' @param X A matrix
#' @param y A vector
#' @return a vector of coefficients
#' @examples
#' n <- 100; p <- 10
#' X <- matrix(rnorm(n*p), n, p)
#' beta <- runif(p, 1, 2) * sample(c(-1,1), p, rep=TRUE)
#' y <- X %*% beta + rnorm(n)
#' OLS(X,y)
#' @export
OLS <- function(X,y) {
beta.hat <- chol2inv(chol(crossprod(X))) %*% crossprod(X,y)
beta.hat
}
```
Effacez le fichier `NAMESPACE` et lancez la commande
```{r, eval=FALSE, echo=TRUE}
devtools::document()
```
pour générer les fichiers d'aide et mettre à jour le `NAMESPACE`.
### Exercice 5
* Contruire le package et l'installer. Lorsqu'on dispose d'un projet Rstudio associé à un package, ceci peut être fait simplement à l'aide du raccourci `Ctrl + Shift + B` ou du bouton correspondant en haut à droite.
* Vérifier que le package et le code fonctionnent via l'exemple de votre fonction.
* Vérifier que votre package est publibale sur `CRAN` à l'aide du bouton `Check` ou du raccourci `Ctrl + Shift + E`.
## Intégration de code C++
On souhaite accélérer le code en réalisant la partie coûteuse des calculs à l'aide d'un code `C++`.
### Exercice 1
Spécifiez via Rstudio que vous allez dorénavant utiliser du code C++, à l'aide de la commande
```{r, eval = FALSE, echo=TRUE}
devtools::use_rcpp()
```
Observez les modifications apportées à votre packages. Commentez.
### Exercice 2
Créer un fichier `OLS-pkg.R` dans lequel vous intégrerez les lignes suivantes. Vous pouvez également compléter ce fichier pour écrire un texte de présentation générale de votre package qui apparaîtra en début de documentation.
```{r, eval=FALSE, echo=TRUE}
#' package OLSfit
#'
#' Dans ce package, on trouve les fonctions trucs bidule et muche. Elles font ceci et cela. Les classes d'objets Robert et MItchoum font etc.
#'
#' @name OLS-pkg
#' @docType package
#'
#' @useDynLib OLSfit
#' @importFrom Rcpp sourceCpp
NULL
```
### Exercice 3
Créez un fichier `OLS.cpp` dans le répertoire `src`. À l'aide d'[armadillo](http://arma.sourceforge.net), compléter le fichier suivant:
#### Question {-}
```{r OLScpp, eval=FALSE}
#include "RcppArmadillo.h"
// [[Rcpp::depends(RcppArmadillo)]]
NumericVector OLScpp(const arma::mat X, const arma::vec y) {
}
```
#### Solution {-}
```{r OLScpp-solution, eval=FALSE}
#include "RcppArmadillo.h"
// [[Rcpp::depends(RcppArmadillo)]]
NumericVector OLScpp(const arma::mat X, const arma::vec y) {
return wrap( inv_sympd(X.t() * X) * X.t() * y ) ;
}
```
Ajoutez `RcppArmadillo` au champ `LinkingTo` du fichier `DESCRIPTION`.
Enfin, faites un `build and reload` de votre package. Constatez les fichiers nouvellement créer. Commentez.
### Exercice 4
Ouvrez le ficher `RcppExport.R`. À l'aide de son contenu, créer une nouvelle fonction `OLSfast` dans un nouveau fichier. Regénérer les fichiers de doc à l'aide de Roxygen2. Comparer `OLS` à `OLSfast` avec microbenchmark.
### Exercice 5
Publiez votre package sur github.