Programmeren in R: de basis: Eigen functies programmeren
De standaardvorm van een functiedefinitie
Net als andere objecten moeten functies worden gedefinieerd voordat ze kunnen worden gebruikt. Een eenvoudig voorbeeld hiervan is de definitie van de veeltermfunctie \(f(x)=x^3 + x - 1\) .
Voorbeeldsessie in R In de 'console' van RStudio kun je de functie als volgt definiëren:
> f <- function(x) { x^3 + x - 1 } > f(-2:2) # pas de functie f toe op -2, -1, 0, 1, 2 [1] -11 -3 -1 1 9
In een script verdelen we de code meestal over verschillende regels voor leesbaarheid, en dan ziet de definitie er als volgt uit:
f <- function(x) {
value <- x^3 + x -1
return(value)
}
We voegen nog één voorbeeld toe: bekijk het voorbeeld en lees dan de uitleg
De functie \(e^x\) heeft de volgende machtreeksontwikkeling: \[\begin{aligned}e^x &= 1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+\cdots\\ &= \sum_{k=0}^{\infty}\frac{x^k}{k!}\end{aligned}\] Stel nu dat we veeltermfuncties \(F_n(x)\) ) het functievoorschrift geven dat het de veelterm is die je zou krijgen als je de machtreeks na \(n\) termen afkapt. Dus: \[F_n(x)=\sum_{k=0}^{n}\frac{x^k}{k!}\] Op deze manier krijgen we een reeks functies \(F_1, F_2, \cdots\) Omdat we niet elke functie afzonderlijk willen definiëren, construeren we een R-functie F
met twee argumenten, namelijk \(x\) en \(n\), in het volgende script:
F <- function(x, n) {
som <- 0
for (k in 0:n) {
som <- som + x^k/factorial(k)
}
return(som)
}
print(F(1, 3)) # ruwe benadering van het getal e
print(F(1, 5)) # goede benadering van het getal e
print(F(1, 10)) # betere benadering van het getal e
Je krijgt drie getallen als uitvoer, namelijk 2.66667, 2.716667, en 2.718282, wanneer je het script uitvoert. De laatste instructie laat zien dat de functie voor \(n=10\) en \(x=1\) een numeriek resultaat oplevert dat de exacte waarde van \(e\), de basis van de natuurlijke logaritme, benadert met een nauwkeurigheid van 6 decimalen. De afwijking van de reeksbenadering van de exacte waarde wordt de afbreekfout van de benadering genoemd.