[R-es] Alternativas a uso de variables globales

Ramon Diaz-Uriarte rdiaz02 en gmail.com
Jue Jul 8 13:19:32 CEST 2010


Estimado J. Miguel,

No creo que lo resuelva del todo, pero dos ideas:

1. Si cte y pdf se definen dentro de un bloque de código delimitado
por "{}", o sea una expresión completa, no hay necesidad de usar
"<<-", pues por la reglas del lexical scope se usará el valor
existente en ese entorno. Por ejemplo:

f2 <- function() {
   zz <- 3
   f3 <- function(x) {x * zz}
   f3(2)
}

f2()


(Aquí "zz" sería el equivalente a tu "cte").

Por supuesto, "zz" puede alterarse dentro de ese loop, y la invocación
a f3 usará el valor al que "zz" está "bounded" en el environment en el
que f3 se ha definido.


Por ejemplo

f2b <- function() {
   zz <- round(rnorm(1, 30, 5))
   cat("\n zz es ", zz, "\n")
   f3 <- function(x) {x * zz}
   f3(2)
}

f2b()
f2b()




2. Puedes hacer que los valores de "cte" sean elementos de una lista,
y lo que usas dentro de pdf es acceso a esa lista.


Cualquier de esos mecanismos evitan los problemas más serios de "<<-"
(el sobreescribir variables que ya existen y los side-effects
descontrolados).

Un saludo,

R.





2010/7/8 J. Miguel Marin <jmmarin en est-econ.uc3m.es>:
> Hola a tod en s,
>
> tengo una duda que se relaciona con alternativas al uso de variables
> globales.
>
> En principio, si se quiere usar un generador de v.a con la librería Runuran
> sólo se permite definir las funciones de densidad (o el núcleo de las
> mismas) con funciones con un único argumento en (x).
>
> Sin embargo, necesito pasar a las funciones más argumentos que van cambiando
> en las iteraciones de un ciclo largo, dado que estas v.a. dependen de otras
> en un muestreador de Gibbs (esto es sólo un detalle). El único modo que se
> me ocurre es mediante variables globales usando el operador "<<-"
> Sin embargo, esto tiene muy mala fama entre los gurús de la programación.
>
> Un ejemplo naif de lo que digo sería el siguiente:
>
> #................................................................
> # asignas cte como variable global
> cte <<- -0.5
>
> # Defines el nucleo de una densidad normal en funcion de x solo
> pdf <- function (x) { exp(cte*x^2) }
>
> # Generas una muestra de tamaño 100 de una distribucion normal con Runuran
> library(Runuran)
> gen <- tdr.new(pdf=pdf, lb=-Inf, ub=Inf)
> x <- ur(gen,100)
> plot(density(x))
> #................................................................
>
> ¿Sabeis de algún modo mejor de hacerlo, sin usar "<<-"?
>
> Y saludos
>
> jm~
>
> _______________________________
>
>       J. Miguel Marin
>
> http://www.est.uc3m.es/jmmarin
>
>   Dep. of Statistics
> University Carlos III of Madrid
>       Spain (E.U.)
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



-- 
Ramon Diaz-Uriarte
Structural Biology and Biocomputing Programme
Spanish National Cancer Centre (CNIO)
http://ligarto.org/rdiaz
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