TetaTricks/chap/R.tex
2023-11-29 14:10:57 +01:00

238 lines
8.0 KiB
TeX

\chapter{R}
\index{R}
% new: Mon Oct 9 07:44:09 UTC 2023
% https://raw.githubusercontent.com/wurli/r-best-practice/main/cheatsheet.jpg
% ======================================================================
Je n'ai certainement pas la prétention de vous enseigner
les arcanes du \textsl{R project},
je suis (octobre 2023) en pleine périoe de découverte.
Mais j'ai déja un projet concret en tête, et ce chapitre sera,
dans un premier temps, composé de mes notes de voyage.
\begin{quote}
R is a language which bears a passing resemblance to the S language
developed at AT\&T Bell Laboratories.
It provides support for a variety of statistical and graphical analyses.
R is a true computer language which contains a number of control-flow
constructions for iteration and alternation.
It allows users to add additional functionality by defining new functions.
\end{quote}
% ======================================================================
\section{Les bases}
Le caractère \texttt{>} est le prompt de R, il vous invite à taper
des commandes afin qu'il vous explique le sens de la vie.
On peut définir des variables, leur donner une valeur et faire des calculs
avec ces variables,
ce qui est bien suffisant pour commencer. Démonstration~:
\begin{verbatim}
> a <- 22
> b <- 7
> a ; b
[1] 22
[1] 7
> a / b
[1] 3.142857
\end{verbatim}
Les choses semblent simples, nous avons approximé $\pi$.
Les deux premières lignes affectent des valeurs aux variables a et b.
La troisième demande l'affichage de ces variables, et la quatrimème
fait le calcul du nombre qu'il faut apprendre aux sages..
% ----------------------------------------------------------------------
\subsection{Variables}
Elles sont auto-vivifiantes\footnote{Si quelqu'un a un meilleur terme,
je sui preneur}, c'est-à-dire qu'elles existent dès qu'elles
sont référencées, il n'y a pas de déclaration préalable à faire.
Enfin, avec R, il ne faudrait pas parler de variables, mais
d'objets, lesquels contenant les variables.
Ces objets/variables peuvent être de différents types : chaines de caractères,
valeurs numériques, booléens\dots
% ----------------------------------------------------------------------
\subsection{Builtins}
Quelques fonctions de base, plus ou moins vaguement expliquées.
\vspace{1em}
\begin{tabular}{|l|p{7cm}|}
\hline
\textbf{Fonction} & \textbf{Signification} \\
\hline
foo <- 3.14159 & Affectation d'une valeur à une variable \\
ls() & Liste les objets actuellement chargé. \\
help(foobar) & Avoir de l'aide sur la chose \textsl{foobar}, %
abréviation: ?foobar \\
class(pixel) & Classe de l'objet (numeric, data.frame, ...) \\
str(foobar) & Information sur l'objet 'foobar' \\
\hline
\end{tabular}
% ----------------------------------------------------------------------
\subsection{Scripting}
\textbf{R --vanilla --quiet < mon-script.R}
La magie du shebang\index{shebang}
% Heredoc ?
% ======================================================================
\section{Un cas concret}
Nous disposons d'un fichier SSV
(Space Separated Values)\footnote{C'est nouveau, ça vient de sortir.}
provenant d'un système optico-numérique bi-dimensionnel multi-planaire
(aka Webcam\index{Webcam}).
Et nous voulons en tirer quelques chiffres et graphiques bien
clinquants,
par exemple les éventuels rapports entre le rouge et le bleu.
Pour la facilité de la mise en page, nous allons utiliser un fichier
contenant seulement huit lignes de données,
alors qu'un cas réel en comprend quelques centaines de milliers.
Voici les quelques lignes de ce fichier~:
\begin{verbatim}
X Y R G B
0 0 0.000000 0.000000 0.000000
240 0 3967.814941 1983.907471 0.000000
480 0 7935.629883 3967.814941 0.000000
720 0 11903.445312 5951.722656 0.000000
0 240 0.000000 3967.814941 7935.629883
240 240 3967.814941 5951.722656 7935.629883
480 240 7935.629883 7935.629883 7935.629883
720 240 11903.445312 9919.537109 7935.629883
\end{verbatim}
Vous pouvez remarquer que les noms de colonnes sont sur la première
ligne du fichier, et qu'il y a deux types de données~:
les coordonnées x/y qui sont des nombres entiers, et les composantes
de couleur (r/g/b) qui sont des valeurs flottantes.
% ----------------------------------------------------------------------
Il nous faut maintenant charger ces données dans le logiciel.
La fonction \texttt{read.delim} est là pour ça, il faut juste lui
passer les options convenantes pour notre fichier de données~:
signaler la présence de l'entête avec les noms de colonnes et
le type du séparateur entre champs.
\begin{verbatim}
> pixels <- read.delim("foo.txt", header=TRUE, sep=' ')
> pixels
X Y R G B
1 0 0 0.000 0.000 0.00
2 240 0 3967.815 1983.907 0.00
3 480 0 7935.630 3967.815 0.00
4 720 0 11903.445 5951.723 0.00
5 0 240 0.000 3967.815 7935.63
6 240 240 3967.815 5951.723 7935.63
7 480 240 7935.630 7935.630 7935.63
8 720 240 11903.445 9919.537 7935.63
> class(pixels)
[1] "data.frame"
> pixels$G
[1] 0.000 1983.907 3967.815 5951.723 3967.815 5951.723 7935.630 9919.537
\end{verbatim}
Si vous avez fait cette manipulation, bravo, vous êtes maintenant
un \textsl{data-scientist} reconnu. Mais il nous reste beaucoup
de choses à apprendre. Le voyage n'est pas fini.
Il est temps d'explorer (ou exploiter ?) un peu nos données.
% ======================================================================
\section{Statistiques}
Oui, c'est un peu pour ça que \textbf{R} a été conçu.
Hélas ce n'est pas un domaine qui m'est familier, alors ce que
vous allez lire doit être pris avec des pincettes aussi bien
du coté des maths sous-jacentes que de la méthodologie.
\begin{verbatim}
> mean(pixels$R) ; mean(pixels$G)
[1] 5951.723
[1] 4959.769
\end{verbatim}
% ======================================================================
\section{Graphiques}
Bah c'est pas simple, alors j'ai activé le \textsl{rach-system} et je
suis arrivé à ce petit truc qui me permet de faire de la
\texttt{gif89a}\index{gif89a}, donc je suis content.
Vous allez voir, c'est assez simple, mais le diable\index{Prada}
se cache dans les détails, et un peu aussi dans la doc tortueuse.
% ----------------------------------------------------------------------
\subsection{x/y}
Un des classiques du genre.
\begin{verbatim}
R --vanilla --quiet << __EOR__
pixels <- read.delim("cumul.txt", header=TRUE, sep=' ')
png(filename="cumul.png", width=640, height=480)
plot(pixels\$X, pixels\$B, pch=".",
main="$title", sub="tTh 2023",
xlab="composante rouge",
ylab="composante bleu")
quit(save="no")
__EOR__
\end{verbatim}
Détaillons un peu le script~:
comme dans l'exemple précédent, nous chargeons nos données dans un
\textsl{data.frame}. Ensuite nous spécifions une sortie vers un
fichier image au format PNG\index{PNG}, avec une taille d'image fixée.
Finalement, nous traçons notre image avec l'instruction \texttt{plot}
et ses nombreux paramêtres.
Je vais détailler ceux qui sont utilisés dans cet exemple, et je vous rappelle
que \texttt{help(plot)} est là pour vous aider.
\begin{itemize}
\item \texttt{pch} : type de la plume utilisée
\item \texttt{main} : titre principal de la page
\item \texttt{sub} : sous-titre, placé tout en bas
\item \texttt{xlab} : label de l'axe des X
\item \texttt{ylab} : label de l'axe des Y
\end{itemize}
Avec ça, nous pouvons déja faire quelgues diagrammes corrects
\footnote{Voire même on peut tenter de la gif89a\index{gif89a}},
mais d'autres paramêtres devraient retenir notre attention, comme
la gestion des marges et des couleurs, comment exporter proprement
vers \LaTeX, peut-on faire de la 3D\index{3D}, \dots
% ----------------------------------------------------------------------
\subsection{Histogramme}
hist(datas\$V3, breaks=50)
% ======================================================================
\section{Interface avec l'OS}
% ======================================================================