In vielen Programmiersprachen übergibt man Argumente an Funktionen,
z.B.
meineFunktion(20)
meineFunktion(20)
, und würde da zum Beispiel stehen: meineFunktion(10+10)
meineFunktion(10+10)
,dann wird zuerst
10+10
10+10
gerechnet, und dann doch meineFunktion(20)
meineFunktion(20)
aufgerufen.Das ist in R grundsätzlich erstmal auch so.
meineFunktion <- function(x){
print(x)
}
meineFunktion(20)
meineFunktion(10+10)
meineFunktion <- function(x){
print(x)
}
meineFunktion(20)
meineFunktion(10+10)
meineFunktion <- function(x){ print(x) } meineFunktion(20) meineFunktion(10+10)
Aber man kann in der Funktion definieren, dass dem doch nicht so sein soll.
Das Konzept nennt sich lazy evaluation: Ein Wert wird erst Berechnet, wenn er auch gebraucht wird.
Mit der Funktion
substitute()
substitute()
kann ich in einer Funktion festlegen, dass ich nicht das Ergebnis von 10+10
10+10
haben will, sondern den Code selbst.
meineFunktion <- function(x){
x <- substitute(x)
print(mode(x))
print(x)
}
meineFunktion(20)
meineFunktion(10+10)
meineFunktion <- function(x){
x <- substitute(x)
print(mode(x))
print(x)
}
meineFunktion(20)
meineFunktion(10+10)
meineFunktion <- function(x){ x <- substitute(x) print(mode(x)) print(x) } meineFunktion(20) meineFunktion(10+10)
Dabei fällt auf dass im Falle der Zahl 20 diese auch als Zahl erkannt ist, während
10+10
10+10
als ‚call‘ erkannt wird. Das ist nämlich die Funktion +
die Aufgerufen wird. In R lässt sich der Funktionsaufruf auch so schreiben:'+'(10,10)
'+'(10,10)
Ausführen lässt sich der Code über die
eval()
eval()
-Funktion, und kann zum Beispiel in einem tryCatch()
tryCatch()
verwendet werden.
x <- substitute(10+10)
eval(x)
x <- substitute(10+10)
eval(x)
x <- substitute(10+10) eval(x)