[R-es] ¿Pasar parámetros por referencia?

Ramon Diaz-Uriarte rdiaz02 en gmail.com
Vie Sep 30 09:23:00 CEST 2011




On Wed, 28 Sep 2011 21:56:09 +0200,Servicio de Estadísticas Demográficas y Sociales <seds.ive en gmail.com> wrote:
> [1  <text/plain; ISO-8859-1 (quoted-printable)>]
> La función consiste en un proceso iterativo en el que las modificaciones a
> la matriz grande son del tipo
> matriz.grande[rango1, rango2]<-matriz.normal

> Ese tipo de sentencias creo que puedo modificarlas (sin "estropear" la
> función) si encuentro el modo de que R no intente ubicar de nuevo espacio,
> quizás con ff.


Usar ff requerirá ciertos cambios en el código,, y tendrás que tener
cuidado con guardar los resultados (ff escribe a disco, pero no es
directamente un objeto .RData). Es más trabajo si quieres mover resultados
entre máquinas.



> Lo que veo más problemático es que matriz.grande siga siendo una matriz y no
> un objeto de clase ff para poder incluirlo con comodidad en operaciones
> usuales de matrices.

Con ff no tienes a tu disposición todas las operaciones que hay en R con
matrices. 


> *****

> Lo que comentas de las copias intermedias es justamente el problema que
> tengo. Aunque en la función ponga, por ejemplo,

> matriz.grande[rango1, rango2]<<-nuevos.valores

> en realidad R genera una copia completa de matriz.grande.


Exacto.




Quizás una solución expeditiva sea moverse a una máquina con mucha más RAM
;-).


R.


> Saludos.
> Seds

> El 28 de septiembre de 2011 19:40, Ramon Diaz-Uriarte
> <rdiaz02 en gmail.com>escribió:

> >
> >
> >
> > On Wed, 28 Sep 2011 15:40:43 +0200,Servicio de Estadísticas Demográficas y
> > Sociales <seds.ive en gmail.com> wrote:
> > > [1  <text/plain; ISO-8859-1 (quoted-printable)>]
> > > Lo primero, muchas gracias por tus sugerencias. Voy a investigar el
> > paquete
> > > ff a ver si así lo resuelvo.
> >
> > Pero he visto que luego comentas que los accesos a la matriz están
> > escritos por otra persona. Usar ff requeriría que re-escribieras parte del
> > código.
> >
> >
> > > Sobre la segunda alternativa que apuntas, ¿puede modificarse parte de una
> > > matriz mediante assign o alguna función similar?
> >
> > Sí, claro, puedes hacer assign de lo que sea, en el environment que elijas
> > (entiendo que te refieres al uso de variables globales). Pero el problema
> > de creación de copias intermedias existe. Y en la asignación a matrices, y
> > operaciones como
> >
> > x[, i] <- lo.que.sea
> >
> >
> >
> >
> > puede haber muchas más copias intermedias de las que uno esperaría,
> > incluyendo copias intermedias de la totalidad de x. El último libro de
> > Chambers, creo, explica esto con cierto detalle.
> >
> >
> > Vaya, toquetear cachos de matrices (y vectores) suele ser caro, sobre todo
> > si se hace varias veces.
> >
> >
> >
> >
> > R.
> >
> >
> >
> > > Saludos.
> > > Seds
> >
> > > El 28 de septiembre de 2011 14:17, Ramon Diaz-Uriarte
> > > <rdiaz02 en gmail.com>escribió:
> >
> > > >
> > > >
> > > >
> > > >
> > > > On Wed, 28 Sep 2011 13:53:19 +0200,Servicio de Estadísticas
> > Demográficas y
> > > > Sociales <seds.ive en gmail.com> wrote:
> > > > > [1  <text/plain (quoted-printable)>]
> > > > > ¿Hay alguna manera de pasar a parámetros por referencia?
> > > >
> > > > > El problema es que tengo una matriz muy grande (unos 6 Gb) que al
> > pasarla
> > > > > como parámetro a una función (que, además debe modificarla) R
> > > > internamente
> > > > > trata de copiarla y se genera un error de "imposible ubicar un vector
> > de
> > > > 6
> > > > > Gb)
> > > >
> > > >
> > > > Hay varios paquetes en CRAN que implementan diversas formas de acceso
> > por
> > > > referencia. Pero, en tu caso, quizás el paquete "ff" (que deja las
> > cosas
> > > > en disco, y accede sólo ---pero de forma muy rápida--- a lo necesario)
> > te
> > > > sea más útil.
> > > >
> > > > > Aunque sé que no es buena práctica, también me valdría si pudieran
> > > > definirse
> > > > > variables "globales".
> > > >
> > > >
> > > > Puedes imitar parcialmente el comportamiento de variables globales
> > usando
> > > > las reglas del scope, si no redefines la variable en el conjunto de
> > > > environments anidados, y si no la pasas como parámetro de tu función. Y
> > > > pudes cambiar esas variables globales con assign, y similares.
> > > >
> > > >
> > > > Pero generalmente suele dar lugar a código difícil de mantener y
> > debuggear.
> > > >
> > > > Un saludo,
> > > >
> > > >
> > > > R.
> > > >
> > > >
> > > > > Un saludo.
> > > > > Seds
> > > >
> > > > >       [[alternative HTML version deleted]]
> > > >
> > > > > [2  <text/plain; iso-8859-1 (quoted-printable)>]
> > > > > _______________________________________________
> > > > > R-help-es mailing list
> > > > > R-help-es en r-project.org
> > > > > https://stat.ethz.ch/mailman/listinfo/r-help-es
> > > > --
> > > > Ramon Diaz-Uriarte
> > > > Department of Biochemistry
> > > > Universidad Autónoma de Madrid
> > > > Spain
> > > >
> > > > http://ligarto.org/rdiaz
> > > >
> > > > Temporarily at:
> > > > Structural Biology and Biocomputing Programme
> > > > Spanish National Cancer Centre (CNIO)
> > > >
> > > > Phone: +34-91-732-8000 ext. 3019
> > > > Fax: +-34-91-224-6972
> > > >
> > > [2  <text/html; ISO-8859-1 (quoted-printable)>]
> >
> > --
> > Ramon Diaz-Uriarte
> > Department of Biochemistry
> > Universidad Autónoma de Madrid
> > Spain
> >
> > http://ligarto.org/rdiaz
> >
> > Temporarily at:
> > Structural Biology and Biocomputing Programme
> > Spanish National Cancer Centre (CNIO)
> >
> > Phone: +34-91-732-8000 ext. 3019
> > Fax: +-34-91-224-6972
> >
> [2  <text/html; ISO-8859-1 (quoted-printable)>]

-- 
Ramon Diaz-Uriarte
Department of Biochemistry
Universidad Autónoma de Madrid
Spain

http://ligarto.org/rdiaz

Temporarily at:
Structural Biology and Biocomputing Programme
Spanish National Cancer Centre (CNIO)
 
Phone: +34-91-732-8000 ext. 3019
Fax: +-34-91-224-6972



Más información sobre la lista de distribución R-help-es