R Programmiertipps: substitute()

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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
x <- substitute(10+10)
eval(x)
x <- substitute(10+10) eval(x)
x <- substitute(10+10)
eval(x)

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert