Anruf durch Bezugnahme in R.

Call by Reference in R: Manchmal ist es praktisch, die Funktion “Call by Reference Evaluation” in einer R-Funktion zu verwenden. Wenn Sie beispielsweise mehrere Rückgabewerte für Ihre Funktion haben möchten, geben Sie entweder eine Liste mit Rückgabewerten zurück und teilen diese anschließend auf, oder Sie können den Wert über das Argument zurückgeben.

Aus bestimmten Gründen (ich würde es auch gerne wissen) unterstützt R Call-by-Reference nicht. Der erste Grund, der mir in den Sinn kommt, ist die Sicherheit. Wenn die Funktion als Referenz aufgerufen werden kann, ist es schwieriger, den Code zu verfolgen und zu debuggen (Sie müssen herausfinden, welche Funktion den Wert Ihrer Variablen ändert, indem Sie die Details Ihrer Variablen untersuchen Funktion). Tatsächlich ruft R als Referenz auf, wenn der Wert des Arguments nicht geändert wird. Sie erstellen nur dann eine Kopie des Arguments, wenn der Wert geändert wird. Wir können also erwarten, dass es keinen (zumindest keinen signifikanten) Effizienzgewinn gibt, selbst wenn wir als Referenz anrufen können.

Pseudoaufruf als Referenz

Auf jeden Fall ist es immer gut zu wissen, wie man einen “Pseudo-Aufruf als Referenz” in R hat (Sie können wählen (nicht), um ihn aus irgendeinem Grund zu verwenden). Der Trick zum Implementieren eines Aufrufs durch Referenz besteht darin, die Funktion eval.parent in R zu verwenden. Sie können einen Code hinzufügen, um den Argumentwert in der übergeordneten Umgebung zu ersetzen, sodass die Funktion so aussieht, als würde sie die Auswertungsstrategie für den Aufruf durch Referenz implementieren. Hier einige Beispiele, wie es geht:

1
2
3
4
5
6
7
set<-function(x,value){
eval.parent(substitute(x<-value))
}
valX <- 51
set(valX ,10)
valX
>[1] 10
1
2
3
4
5
6
7
addOne_1<-function(x,value){
eval.parent(substitute(x<-x+1))
}
valX <- 51
addOne_1(valX)
valX
>[1] 52

Beachten Sie, dass Sie den Wert von x innerhalb der Funktion nicht ändern konnten. Wenn Sie den Wert von x ändern, wird ein neues Objekt erstellt. Die Ersatzfunktion ersetzt x durch den neuen Wert und daher funktioniert diese Methode nicht. Zum Beispiel

1
2
3
4
5
6
7
addOne_2<-function(x,value){
x<-x+1
eval.parent(substitute(x<-x))
}
valX <- 51
addOne_2(valX)
>Error in 52 <- 52 : invalid (do_set) left-hand side to assignment

Wenn Sie den Wert von x innerhalb der Funktion ändern möchten, müssen Sie x in ein neues Objekt kopieren und ein neues Objekt als x verwenden. Am Ende der Funktion können Sie den Wert von x in der übergeordneten Umgebung durch das neue Objekt ersetzen.

1
2
3
4
5
6
7
8
9
addOne_3<-function(x,value){
xx<-x
xx<-xx+1
eval.parent(substitute(x<-xx))
}
valX <- 51
addOne_3(valX)
valX
>[1] 52

Eine andere Möglichkeit, einen Aufruf per Referenz formeller durchzuführen, ist die Verwendung der R.oo-Pakete.

Ein anderer Weg zu implementieren.

TszKin Julian Chan

Leave a Reply