Fonctions dans la programmation R avec exemple
โก Rรฉsumรฉ intelligent
Dans R, les fonctions regroupent un ensemble d'instructions sous un mรชme nom, permettant ainsi d'exรฉcuter une tรขche rรฉpรฉtitive en un seul appel. R propose des fonctions intรฉgrรฉes pour les mathรฉmatiques et les statistiques, des fonctions dรฉfinies par l'utilisateur et des variables d'environnement.pingLes arguments conditionnels et les arguments conditionnels sont abordรฉs ici avec des exemples concrets.

Quโest-ce quโune fonction dans R ?
A fonction, dans un environnement de programmation, est un ensemble d'instructions. Un programmeur construit une fonction pour รฉviter rรฉpรฉter la mรชme tรขche, ou rรฉduire complexitรฉ.
Une fonction doit รชtre
- รฉcrit pour accomplir une tรขche spรฉcifique
- peut ou non inclure des arguments
- contenir un corps
- peut renvoyer une ou plusieurs valeurs.
Une approche gรฉnรฉrale d'une fonction consiste ร utiliser la partie argument comme entrรฉes, nourrissez le corps partie et enfin retourner un sortie. La syntaxe d'une fonction est la suivante :
function (arglist) { #Function body }
R fonctions intรฉgrรฉes importantes
Il existe de nombreuses fonctions intรฉgrรฉes dans R. R fait correspondre vos paramรจtres d'entrรฉe avec ses arguments de fonction, soit par valeur, soit par position, puis exรฉcute le corps de la fonction. Les arguments de la fonction peuvent avoir des valeurs par dรฉfaut : si vous ne spรฉcifiez pas ces arguments, R prendra la valeur par dรฉfaut.
Note:
Il est possible de voir le code source d'une fonction en exรฉcutant le nom de la fonction elle-mรชme dans la console.
Typing Un nom de fonction sans crochets affiche son code source, comme le montre la console ci-dessous.
Nous verrons trois groupes de fonctions en action
- Fonction gรฉnรฉrale
- Fonction mathรฉmatique
- Fonction statistique
Fonctions gรฉnรฉrales
Nous connaissons dรฉjร les fonctions gรฉnรฉrales telles que cbind(), rbind(), range(), sorte()`order()` et `order()`. Chacune de ces fonctions a une tรขche spรฉcifique, prend des arguments et renvoie un rรฉsultat. Voici quelques fonctions importantes ร connaรฎtre :
fonction diff()
Si vous travaillez sur des sรฉries chronologiques, il faut arrรชter la sรฉrie en prenant leur valeurs de dรฉcalage. A processus stationnaire Permet de maintenir la moyenne, la variance et l'autocorrรฉlation constantes au fil du temps. Ceci amรฉliore principalement la prรฉdiction d'une sรฉrie temporelle. On peut rรฉaliser cela avec la fonction `diff()`. On peut crรฉer une sรฉrie temporelle alรฉatoire avec une tendance, puis utiliser la fonction `diff()` pour la rendre stationnaire. La fonction `diff()` accepte un argument, un vecteur, et renvoie les diffรฉrences dรฉcalรฉes et itรฉrรฉes appropriรฉes.
NoteNous devons souvent gรฉnรฉrer des donnรฉes alรฉatoires, mais pour l'apprentissage et la comparaison, nous souhaitons que les nombres soient identiques d'une machine ร l'autre. Afin de garantir la gรฉnรฉration de donnรฉes identiques, nous utilisons la fonction `set.seed()` avec des valeurs arbitraires de 123. `set.seed()` fixe le point de dรฉpart du gรฉnรฉrateur de nombres pseudo-alรฉatoires, de sorte que chaque machine produise la mรชme sรฉquence. Sans `set.seed()`, chaque exรฉcution renverrait une sรฉquence diffรฉrente.
set.seed(123) ## Create the data x = rnorm(1000) ts <- cumsum(x) ## Stationary the serie diff_ts <- diff(ts) par(mfrow=c(1,2)) ## Plot the series plot(ts, type='l') plot(diff(ts), type='l')
Les deux graphiques ci-dessous placent la sรฉrie cumulative originale ร cรดtรฉ de la sรฉrie diffรฉrenciรฉe, qui fluctue dรฉsormais autour d'une moyenne constante.
fonction longueur()
Dans de nombreux cas, nous avons besoin de connaรฎtre la longueur d'un vecteur pour effectuer des calculs ou l'utiliser dans une boucle `for`. La fonction `length()` compte le nombre de lignes du vecteur `x`. Les exemples de code suivants importent le jeu de donnรฉes `cars` et renvoient le nombre de lignes.
NoteLa fonction `length()` renvoie le nombre d'รฉlรฉments d'un vecteur. Si la fonction est passรฉe en argument ร un vecteur, elle renvoie le nombre d'รฉlรฉments d'un vecteur. matrice ou un cadre de donnรฉes, le nombre de colonnes est renvoyรฉ.
dt <- cars
## number columns
length(dt)
Sortie :
## [1] 1
## number rows
length(dt[,1])
Sortie :
## [1] 50
Fonctions mathรฉmatiques
Au-delร des fonctions d'assistance gรฉnรฉrales, R dispose d'un ensemble de fonctions mathรฉmatiques qui opรจrent รฉlรฉment par รฉlรฉment sur un vecteur.
| Opรฉrateur | Description |
|---|---|
| abs (x) | Prend la valeur absolue de x |
| journal(x,base=y) | Prend le logarithme de x de base y ; si la base n'est pas spรฉcifiรฉe, renvoie le logarithme nรฉpรฉrien |
| exp (x) | Renvoie l'exponentielle de x |
| sqrt (x) | Renvoie la racine carrรฉe de x |
| factorielle(x) | Renvoie la factorielle de x (x !) |
# sequence of number from 44 to 55 both including incremented by 1 x_vector <- seq(45,55, by = 1) #logarithm log(x_vector)
Sortie :
## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826 ## [8] 3.951244 3.970292 3.988984 4.007333
#exponential
exp(x_vector)
#squared root
sqrt(x_vector)
Sortie :
## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428 ## [8] 7.211103 7.280110 7.348469 7.416198
#factorial
factorial(x_vector)
Sortie :
## [1] 1.196222e+56 5.502622e+57 2.586232e+59 1.241392e+61 6.082819e+62 ## [6] 3.041409e+64 1.551119e+66 8.065818e+67 4.274883e+69 2.308437e+71 ## [11] 1.269640e+73
Fonctions statistiques
Lร oรน les fonctions mathรฉmatiques transforment les valeurs, les fonctions statistiques les rรฉsument. L'installation standard de R contient un large รฉventail de fonctions statistiques. Dans ce tutoriel, nous aborderons briรจvement les plus importantes.
Fonctions statistiques de base
| Opรฉrateur | Description |
|---|---|
| moyenne(x) | Moyenne de x |
| mรฉdiane(x) | Mรฉdiane de x |
| variable(x) | Variation de x |
| sd(x) | รcart type de x |
| รฉchelle(x) | Scores standards (z-scores) de x |
| quantile(x) | Les quartiles de x |
| rรฉsumรฉ(x) | Rรฉsumรฉ de x : moyenne, min, max etc. |
speed <- dt$speed
speed
# Mean speed of cars dataset
mean(speed)
Sortie :
## [1] 15.4
# Median speed of cars dataset
median(speed)
Sortie :
## [1] 15
# Variance speed of cars dataset
var(speed)
Sortie :
## [1] 27.95918
# Standard deviation speed of cars dataset
sd(speed)
Sortie :
## [1] 5.287644
# Standardize vector speed of cars dataset
head(scale(speed), 5)
Sortie :
## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489
# Quantile speed of cars dataset
quantile(speed)
Sortie :
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset
summary(speed)
Sortie :
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0
Jusquโร prรฉsent, nous avons appris beaucoup de fonctions intรฉgrรฉes de R.
NoteFaites attention au classe de l'argument, cโest-ร -dire numรฉrique, boolรฉen ou chaรฎne de caractรจres. Par exemple, si nous devons transmettre une valeur de type chaรฎne de caractรจres, nous devons lโentourer de guillemets : ยซ ABC ยป.
Fonction d'รฉcriture dans R
Dans certains cas, nous devons รฉcrire notre propre fonction car nous devons accomplir une tรขche particuliรจre et aucune fonction toute faite n'existe. Une fonction dรฉfinie par l'utilisateur implique un Le nom, arguments , lโaspect รฉconomique corps.
function.name <- function(arguments) { computations on the arguments some other code }
Note: Une bonne pratique consiste ร nommer une fonction dรฉfinie par l'utilisateur diffรฉrente d'une fonction intรฉgrรฉe. Cela รฉvite toute confusion.
Fonction ร un argument
Dans lโextrait suivant, nous dรฉfinissons une simple fonction carrรฉe. La fonction accepte une valeur et renvoie le carrรฉ de la valeur.
square_function<- function(n) { # compute the square of integer `n` n^2 } # calling the function and passing value 4 square_function(4)
Code Explication
- La fonction est nommรฉe square_function ; on peut l'appeler comme on veut.
- Il reรงoit un argument ยซ n ยป. Nous n'a pas prรฉcisรฉ le type de variable pour que l'utilisateur puisse passer un entier, un vecteur ou une matrice
- La fonction prend l'entrรฉe ยซ n ยป et renvoie le carrรฉ de l'entrรฉe. Lorsque vous avez fini d'utiliser la fonction, nous pouvons la supprimer avec la fonction rm().
# aprรจs avoir crรฉรฉ la fonction
rm(square_function) square_function
Sur la console, on peut voir un message d'erreur :Error: object 'square_function' not found indiquant que la fonction n'existe pas.
Environnement Scoping
Dans R, le convivial est une collection d'objets tels que des fonctions, des variables, des cadres de donnรฉes, etc.
R ouvre un environnement ร chaque dรฉmarrage de RStudio.
L'environnement de niveau supรฉrieur disponible est le environnement global, appelรฉ R_GlobalEnv. Et nous avons le environnement local.
Nous pouvons lister le contenu de l'environnement actuel.
ls(environment())
Sortie
## [1] "diff_ts" "dt" "speed" "square_function" ## [5] "ts" "x" "x_vector"
Vous pouvez voir toutes les variables et fonctions crรฉรฉes dans R_GlobalEnv.
La liste ci-dessus variera pour vous en fonction du code historique que vous exรฉcutez dans RStudio.
Notez que n, l'argument de la fonction square_function ne se trouve pas dans cet environnement global.
Un nouvel environnement est crรฉรฉ pour chaque fonction. Dans l'exemple ci-dessus, la fonction square_function() crรฉe un nouvel environnement ร l'intรฉrieur de environnement global.
Pour clarifier la diffรฉrence entre de dรฉfis et locales Dans cet environnement, รฉtudions l'exemple suivant.
Ces fonctions prennent une valeur x comme argument et l'ajoutent ร y dรฉfinir ร l'extรฉrieur et ร l'intรฉrieur de la fonction
La fonction f renvoie la sortie 15. En effet, y est dรฉfini dans l'environnement global. Toute variable dรฉfinie dans l'environnement global peut รชtre utilisรฉe localement. La variable y a la valeur 10 lors de tous les appels de fonction et est accessible ร tout moment.
Voyons ce qui se passe si la variable y est dรฉfinie ร l'intรฉrieur de la fonction.
Nous devons supprimer `y` avant d'exรฉcuter ce code en utilisant rm r
La sortie est รฉgalement 15 lorsque nous appelons f(5) mais renvoie une erreur lorsque nous essayons d'imprimer la valeur y. La variable y n'est pas dans l'environnement global.
Enfin, R utilise la dรฉfinition de variable la plus rรฉcente pour passer ร lโintรฉrieur du corps dโune fonction. Considรฉrons l'exemple suivant :
R ignore les valeurs y dรฉfinies en dehors de la fonction car nous avons explicitement crรฉรฉ une variable y ร l'intรฉrieur du corps de la fonction.
Fonction multi-arguments
Nous pouvons รฉcrire une fonction avec plus d'un argument. Considรฉrons la fonction appelรฉe ยซ fois ยป. C'est une fonction simple multipliant deux variables.
times <- function(x,y) {
x*y
}
times(2,4)
Sortie :
## [1] 8
Quand devons-nous รฉcrire une fonction ?
Les data scientists doivent effectuer de nombreuses tรขches rรฉpรฉtitives. La plupart du temps, ils copient et collent des portions de code de maniรจre rรฉpรฉtรฉe. Par exemple, la normalisation d'une variable est fortement recommandรฉe avant d'exรฉcuter une analyse. machine learning algorithme. La formule pour normaliser une variable est la suivante :
Nous savons dรฉjร comment utiliser les fonctions min() et max() dans R. Nous utilisons la bibliothรจque tibble pour crรฉer le bloc de donnรฉes. Tibble est jusqu'ร prรฉsent la fonction la plus pratique pour crรฉer un ensemble de donnรฉes ร partir de zรฉro.
library(tibble) # Create a data frame data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), )
Nous allons procรฉder en deux รฉtapes pour calculer la fonction dรฉcrite ci-dessus. Dans un premier temps, nous crรฉerons une variable appelรฉe c1_norm qui correspondra au facteur de mise ร l'รฉchelle de c1. Dans un second temps, nous copierons et collerons simplement le code de c1_norm et le remplacerons par c2 et c3.
Dรฉtail de la fonction avec la colonne c1 :
Nominateur : : data_frame$c1 -min(data_frame$c1))
Dรฉnominateur : max(data_frame$c1)-min(data_frame$c1))
Par consรฉquent, nous pouvons les diviser pour obtenir la valeur normalisรฉe de la colonne c1 :
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Nous pouvons crรฉer c1_norm, c2_norm et c3_norm :
Create c1_norm: rescaling of c1
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
# show the first five values
head(data_frame$c1_norm, 5)
Sortie :
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
รa marche. Nous pouvons copier et coller
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
puis changez c1_norm en c2_norm et c1 en c2. On fait de mรชme pour crรฉer c3_norm
data_frame$c2_norm <- (data_frame$c2 - min(data_frame$c2))/(max(data_frame$c2)-min(data_frame$c2)) data_frame$c3_norm <- (data_frame$c3 - min(data_frame$c3))/(max(data_frame$c3)-min(data_frame$c3))
Nous avons parfaitement redimensionnรฉ les variables c1, c2 et c3.
Cependant, cette mรฉthode est sujette aux erreurs. On peut copier et oublier de modifier le nom de la colonne aprรจs le collage. Par consรฉquent, il est recommandรฉ d'รฉcrire une fonction chaque fois que le mรชme code doit รชtre collรฉ plus de deux fois. On peut ensuite rรฉorganiser le code en une formule et l'appeler au besoin. Pour รฉcrire notre propre fonction, il nous faut fournir :
- Nom : normaliser.
- le nombre d'arguments : nous n'avons besoin que d'un seul argument, qui est la colonne que nous utilisons dans notre calcul.
- Le corps : cโest tout simplement la formule ร laquelle nous souhaitons revenir.
Nous allons procรฉder รฉtape par รฉtape pour crรฉer la fonction normaliser.
รtape 1) On crรฉe le numรฉrateur, qui est x โ min(x). En R, on peut stocker le numรฉrateur dans une variable comme ceci :
nominator <- x-min(x)
รtape 2) Nous calculons le dรฉnominateur : max(x) โ min(x). Nous pouvons reproduire lโidรฉe de lโรฉtape 1 et stocker le calcul dans une variable :
denominator <- max(x)-min(x)
รtape 3) Nous effectuons la division entre le nominateur et le dรฉnominateur.
normalize <- nominator/denominator
รtape 4) Pour renvoyer la valeur ร la fonction appelante, nous devons passer normalize dans return() pour obtenir la sortie de la fonction.
return(normalize)
รtape 5) Nous sommes prรชts ร utiliser la fonction par wrapping Tout ce qui se trouve ร l'intรฉrieur des parenthรจses.
normalize <- function(x){ # step 1: create the nominator nominator <- x-min(x) # step 2: create the denominator denominator <- max(x)-min(x) # step 3: divide nominator by denominator normalize <- nominator/denominator # return the value return(normalize) }
Testons notre fonction avec la variable c1 :
normalize(data_frame$c1)
Cela fonctionne parfaitement. Nous avons crรฉรฉ notre premiรจre fonction.
Une fonction est une mรฉthode plus complรจte pour effectuer une tรขche rรฉpรฉtitive. Nous pouvons utiliser la formule de normalisation sur diffรฉrentes colonnes, comme ci-dessous :
data_frame$c1_norm_function <- normalize (data_frame$c1) data_frame$c2_norm_function <- normalize (data_frame$c2) data_frame$c3_norm_function <- normalize (data_frame$c3)
Bien que l'exemple soit simple, on peut en dรฉduire la puissance d'une formule. Le code ci-dessus est plus lisible et รฉvite les erreurs liรฉes au copier-coller.
Fonctions avec condition
La fonction normalize() fait toujours la mรชme chose. Parfois, il est nรฉcessaire d'inclure des conditions dans une fonction pour permettre au code de renvoyer des rรฉsultats diffรฉrents.
Dans les tรขches d'apprentissage automatique, nous devons diviser l'ensemble de donnรฉes entre une rame et un ensemble de test. La rame permet ร lโalgorithme dโapprendre ร partir des donnรฉes. Afin de tester les performances de notre modรจle, nous pouvons utiliser l'ensemble de test pour renvoyer la mesure de performance. R n'a pas de fonction pour crรฉer deux ensembles de donnรฉes. Nous pouvons รฉcrire notre propre fonction pour faire cela. Notre fonction prend deux arguments et s'appelle split_data(). L'idรฉe derriรจre est simple, nous multiplions la longueur de l'ensemble de donnรฉes (c'est-ร -dire le nombre d'observations) par 0.8. Par exemple, si nous voulons diviser l'ensemble de donnรฉes 80/20 et que notre ensemble de donnรฉes contient 100 lignes, alors notre fonction multipliera 0.8*100 = 80. 80 lignes seront sรฉlectionnรฉes pour devenir nos donnรฉes d'entraรฎnement.
Nous utiliserons l'ensemble de donnรฉes sur la qualitรฉ de l'air pour tester notre fonction dรฉfinie par l'utilisateur. L'ensemble de donnรฉes sur la qualitรฉ de l'air comporte 153 lignes. On peut le voir avec le code ci-dessous :
nrow(airquality)
Sortie :
## [1] 153
Nous procรฉderons de la maniรจre suivante :
split_data <- function(df, train = TRUE) Arguments: -df: Define the dataset -train: Specify if the function returns the train set or test set. By default, set to TRUE
Notre fonction a deux arguments. Le train dโarguments est un paramรจtre boolรฉen. S'il est dรฉfini sur TRUE, notre fonction crรฉe l'ensemble de donnรฉes de train, sinon, elle crรฉe l'ensemble de donnรฉes de test.
Nous pouvons procรฉder comme pour la fonction normalize(). Nous รฉcrivons le code comme s'il n'รฉtait exรฉcutรฉ qu'une seule fois, puis nous intรฉgrons la condition dans le corps de la fonction.
รtape 1 :
Nous devons calculer la longueur de l'ensemble de donnรฉes. Cela se fait avec la fonction nrow(). Nrow renvoie le nombre total de lignes dans l'ensemble de donnรฉes. Nous appelons la longueur variable.
length<- nrow(airquality) length
Sortie :
## [1] 153
รtape 2 :
On multiplie la longueur par 0.8. Il renverra le nombre de lignes ร sรฉlectionner. Il devrait รชtre 153*0.8 = 122.4
total_row <- length*0.8 total_row
Sortie :
## [1] 122.4
Nous souhaitons sรฉlectionner 122 lignes parmi les 153 lignes de l'ensemble de donnรฉes sur la qualitรฉ de l'air. Nous crรฉons une liste contenant des valeurs de 1 ร total_row. Nous stockons le rรฉsultat dans la variable appelรฉe split
split <- 1:total_row split[1:5]
Sortie :
## [1] 1 2 3 4 5
split choisit les 122 premiรจres lignes de l'ensemble de donnรฉes. Par exemple, nous pouvons voir que notre rรฉpartition variable rassemble les valeurs 1, 2, 3, 4, 5 et ainsi de suite. Ces valeurs constitueront l'index lorsque nous sรฉlectionnerons les lignes ร renvoyer.
รtape 3 :
Nous devons sรฉlectionner les lignes de l'ensemble de donnรฉes sur la qualitรฉ de l'air en fonction des valeurs stockรฉes dans la variable fractionnรฉe. Cela se fait comme ceci :
train_df <- airquality[split, ] head(train_df)
Sortie :
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 51 13 137 10.3 76 6 20 ##[3] 15 18 65 13.2 58 5 15 ##[4] 64 32 236 9.2 81 7 3 ##[5] 27 NA NA 8.0 57 5 27 ##[6] 58 NA 47 10.3 73 6 27 ##[7] 44 23 148 8.0 82 6 13
รtape 4 :
Nous pouvons crรฉer l'ensemble de donnรฉes de test en utilisant les lignes restantes, 123:153. Cela se fait en utilisant โ devant split.
test_df <- airquality[-split, ] head(test_df)
Sortie :
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 123 85 188 6.3 94 8 31 ##[3] 124 96 167 6.9 91 9 1 ##[4] 125 78 197 5.1 92 9 2 ##[5] 126 73 183 2.8 93 9 3 ##[6] 127 91 189 4.6 93 9 4 ##[7] 128 47 95 7.4 87 9 5
รtape 5 :
Nous pouvons crรฉer la condition ร lโintรฉrieur du corps de la fonction. N'oubliez pas que nous avons un train d'arguments qui est un boolรฉen dรฉfini sur TRUE par dรฉfaut pour renvoyer la rame. Pour crรฉer la condition, nous utilisons la syntaxe if :
if (train ==TRUE){ train_df <- airquality[split, ] return(train) } else { test_df <- airquality[-split, ] return(test) }
รa y est, nous pouvons รฉcrire la fonction. Nous devons seulement changer la qualitรฉ de l'air en df parce que nous voulons essayer notre fonction sur n'importe quel trame de donnรฉes, pas seulement la qualitรฉ de l'air :
split_data <- function(df, train = TRUE){ length<- nrow(df) total_row <- length *0.8 split <- 1:total_row if (train ==TRUE){ train_df <- df[split, ] return(train_df) } else { test_df <- df[-split, ] return(test_df) } }
Testons notre fonction sur l'ensemble de donnรฉes sur la qualitรฉ de l'air. Nous devrions avoir un ensemble d'entraรฎnement de 122 lignes et un ensemble de test de 31 lignes.
train <- split_data(airquality, train = TRUE)
dim(train)
Sortie :
## [1] 122 6
test <- split_data(airquality, train = FALSE)
dim(test)
Sortie :
## [1] 31 6






