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.)
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
Hola, Yo la verdad no veo mayor problema en evitar las variables globales y utilizar en su lugar variables intermedias que puedan ir cambiado. Un elemento de ayuda a la hora de la legibilidad de tu código es si es posible concentrar esas variables en una parte del programa de manera que puedas localizarlas y comprobar sus valores más fácilmente. Saludos, Carlos Ortega www.qualityexcellence.es 2010/7/8 J. Miguel Marin <jmmarin@est-econ.uc3m.es>> Hola a tod@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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]