R Programmiertipps: substitute()

In vielen Programmiersprachen übergibt man Argumente an Funktionen,
z.B. meineFunktion(20), und würde da zum Beispiel stehen: meineFunktion(10+10),
dann wird zuerst 10+10 gerechnet, und dann doch meineFunktion(20) aufgerufen.
Das ist in R grundsätzlich erstmal auch so.

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() kann ich in einer Funktion festlegen, dass ich nicht das Ergebnis von 10+10 haben will, sondern den Code selbst.

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 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)
Ausführen lässt sich der Code über die eval()-Funktion, und kann zum Beispiel in einem tryCatch() verwendet werden.

x <- substitute(10+10)
eval(x)

Kommentar verfassen

Ihre E-Mail-Adresse wird nicht veröffentlicht.