Llamada por Referencia en R

Llamada por Referencia en R: A veces es conveniente usar “evaluación de llamada por referencia” dentro de una función R. Por ejemplo, si desea tener un valor de retorno múltiple para su función, puede devolver una lista de valores de retorno y dividirlos después o puede devolver el valor mediante el argumento.

Por algunas razones (me gustaría saber también), R no admite llamadas por referencia. La primera razón que me viene a la mente es la seguridad, si la función puede llamar por referencia, es más difícil rastrear el código y depurar (debe averiguar qué función cambia el valor de sus variables examinando los detalles de su función). De hecho, R “llama por referencia” cuando el valor del argumento no cambia. Harán una copia del argumento solo cuando se cambie el valor. Por lo tanto, podemos esperar que no haya una ganancia de eficiencia (al menos no significativa), incluso podemos llamar por referencia.

pseudo llamada por referencia” en R

De todos modos, siempre es bueno saber cómo tener una “pseudo llamada por referencia” en R (puede elegir (no) usarla por cualquier razón). El truco para implementar la llamada por referencia es hacer uso de la función eval.parent en R. Puede agregar un código para reemplazar el valor del argumento en el entorno principal para que la función parezca implementar la estrategia de evaluación de llamada por referencia. Aquí hay algunos ejemplos de cómo hacerlo:

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

Tenga en cuenta que no puede cambiar el valor de x dentro de la función. Si cambia el valor de x, se creará un nuevo objeto. La función de sustitución reemplazará x con el nuevo valor y, por lo tanto, este método no funcionará. Por ejemplo:

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

Si desea cambiar el valor de x dentro de la función, debe copiar x a un nuevo objeto y usar un nuevo objeto como x. Al final de la función, puede reemplazar el valor de x con el nuevo objeto en el entorno principal.

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

Otra forma de hacer una llamada por referencia de manera más formal es usando los paquetes R.oo.

Otra forma de implementar.

TszKin Julian Chan

Leave a Reply