Chiama per Riferimento in R

Chiama per riferimento in R: a volte è conveniente utilizzare “valutazione chiamata per riferimento” all’interno di una funzione R. Ad esempio, se si desidera avere un valore di ritorno multiplo per la propria funzione, è possibile restituire un elenco di valori di ritorno e dividerli in un secondo momento oppure puoi restituire il valore usando l’argomento

Per alcuni motivi (vorrei saperlo anche io), R non supporta le chiamate per riferimento. Il primo motivo che viene in mente è la sicurezza, se la funzione può chiamare per riferimento, è più difficile tracciare il codice e il debug (è necessario scoprire quale funzione modifica il valore delle variabili esaminando i dettagli della funzione). In effetti, R “chiama per riferimento” quando il valore dell’argomento non cambia. Faranno una copia dell’argomento solo quando il valore viene modificato. Pertanto, possiamo aspettarci che non ci sarà alcun guadagno di efficienza (almeno non significativo), che possiamo persino chiamare per riferimento.

Pseudo chiamata per riferimento in R

Ad ogni modo, è sempre bene sapere come avere una “pseudo chiamata per riferimento” in R (puoi scegliere (non) di usarla per qualsiasi motivo). Il trucco per implementare la chiamata per riferimento è utilizzare la funzione eval.parent in R. È possibile aggiungere codice per sovrascrivere il valore dell’argomento nell’ambiente principale in modo che la funzione appaia per implementare la chiamata in base alla strategia di valutazione del riferimento. Ecco alcuni esempi di come farlo:

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

Si noti che non è possibile modificare il valore di x all’interno della funzione. Se si modifica il valore di x, verrà creato un nuovo oggetto. La funzione sostitutiva sostituirà x con il nuovo valore e quindi questo metodo non funzionerà. Per esempio:

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

Un altro modo per chiamare più formalmente come riferimento è usare i pacchetti R.oo.

Un altro modo di implementare.

TszKin Julian Chan

Leave a Reply