[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