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]]