[R-es] ¿Pasar parámetros por referencia?
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