Foro de debate

Uso de variable numérica en funciones

Uso de variable numérica en funciones

de Laura Martinelli -
Número de respuestas: 6
Hola a todos!
Tengo el siguiente inconveniente:

en una función defino la variable "poblacion"

OnDef <- function(poblacion){
....
poblacion <- seq(as.integer(min),as.integer(max),length=as.integer(pob))
....
}

y luego quiero graficarla desde otra función

OnGraf <- function(poblacion){
...
hist(poblacion)
...
}

Y me da el error
Error in hist.default(poblacion) : 'x' must be numeric

Tengo que definir la variable como numérica? Cómo se hace?
Espero puedan ayudarme,
Saludos y gracias
Laura


En respuesta a Laura Martinelli

Re: Uso de variable numérica en funciones

de Manuel Muñoz Márquez -
Los argumentos de las funciones en R se pasan por valor y no por referencia, lo que quiere decir que las modificaciones que realices a los argumentos únicamente tienen efecto dentro de la llamada a la función.

La forma de hacerlo sería utilizando la primera función para que devolviese el resultado y la segunda para dibujarlo:
1. Se define la función OnDef
OnDef <- function(poblacion){
....
poblacion <- seq(as.integer(min),as.integer(max),length=as.integer(pob))
....
return(poblacion)
}
2. Se define la función OnGraf tal cual lo has hecho
3. Se usaría
poblacion <- OnDef(datos_poblacion)
OnGraf(poblacion)

Observaciones:
a. El argumento poblacion se usa únicamente para pasarle valores a la función OnDef, por lo que si no necesitas pasarle valores puedes omitirlo.
b. El valor devuelto por las funciones en R es el especificado en la instrucción return o el último valor calculado, por lo que una alternativa para definir OnDef sería
OnDef <- function(poblacion){
....
seq(as.integer(min),as.integer(max),length=as.integer(pob))
}

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Uso de variable numérica en funciones

de Laura Martinelli -
Hola Manuel, gracias por responder tan pronto!
Probé lo que me dijiste y sigo teniendo inconvenientes

La función OnDef me quedó así:
OnDef <- function(){
...
poblacion <- seq(as.integer(min),as.integer(max),length=as.integer(pob))
return(poblacion)
}

Esta función la llamo desde un botón:
Def.but <-tkbutton(v1,text="Definir población",command=poblacion <- OnDef,bg="white", fg="blue", width="15", borderwidth=3)

La función OnGraf quedó así:
OnGraf <- function(poblacion){
...
hist(poblacion)
...
}

También la llamo desde un botón:
Graf.but <-tkbutton(v1,text="Graficar histograma",command=function() OnGraf(poblacion),bg="white", fg="blue", width="15", borderwidth=3)

En este caso pongo function() delante de la llamada a OnGraf porque sino la función se ejecuta sola antes de presionar el botón.

Ahora, el problema es que cuando presiono sobre el botón Definir funciona bien, pero cuando presiono el botón para graficar me da el siguiente error:
Error in hist.default(poblacion) : 'x' must be numeric

Espero puedas ayudarme
Saludos y gracias
Laura




En respuesta a Laura Martinelli

Re: Uso de variable numérica en funciones

de Manuel Muñoz Márquez -
Aunque no sé decirte porque la llamada a hist está recibiendo un argumento incorrecto.

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Uso de variable numérica en funciones

de Laura Martinelli -
Gracias Manuel, ya me está funcionando!

En realidad cuando defino la población hago que sea variable global y no local a la función:
OnDef <- function(){
...
poblacion <<- seq(as.integer(poblacion_valores[2]),as.integer(poblacion_valores[3]),length=as.integer(poblacion_valores[1]))
...
}

Entonces cuando llamo a OnGraf ya no necesito pasarle el parámetro población.
OnGraf <- function()
{
...
hist(poblacion)
}
y las llamadas a las funciones son así:
Def.but <-tkbutton(v1,text="Definir población",command=OnDef,bg="white", fg="blue", width="15", borderwidth=3)

Graf.but <-tkbutton(v1,text="Graficar histograma",command=function()OnGraf(),bg="white", fg="blue", width="15", borderwidth=3)

El hecho de definir la poblacion como variable global me permite usarla en otra ventana gráfica, que la genera otro archivo .r, donde extraigo muestras de esa población.

Gracias por tu ayuda!
Saludos
En respuesta a Laura Martinelli

Re: Uso de variable numérica en funciones

de Manuel Muñoz Márquez -
El uso de variables globales es una mala práctica de programación y su uso debe estar restringido a los casos en que sea estrictamente necesario.

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Uso de variable numérica en funciones

de Laura Martinelli -

Manuel, a ver si me pueden ayudar entonces...

Con las variables globales solucioné 2 problemas:

1- no logro pasar el valor de una variable local a una función a otra función

El código es el siguiente:
OnMues = function(...){
if (tclvalue(Name1)> 0){
....
mues <- tclvalue(Name1)
muestra <- muestreo(as.integer(mues))
return(muestra)
}else{
tkmessageBox(title="Atención", message="Debe completar la casilla!")
}
}

OnGraf = function(mu){
if (tclvalue(Name1)> 0){
....
hist(mu)
}else{
tkmessageBox(title="Atención", message="Debe completar la casilla!")
}
}

Mues.but <-tkbutton(v1,text="Extraer muestra",command=function()mu <- OnMues(),bg="white", fg="blue", width="15", borderwidth=3)

Graf.but <-tkbutton(v1,text="Graficar histograma",command=function()graf <- OnGraf(mu),bg="white", fg="blue", width="15", borderwidth=3)

El error es: Error in hist(mu) : objeto "mu" no encontrado

2- Necesito el valor de la variable población que se la pido al usuario al comienzo durante todo el funcionamiento del programa, ya que lo uso en distintos archivos .r a los que voy llamando dependiendo de qué opción del menú seleccione.

Si me pueden dar alguna idea que me oriente sobre como puedo encarar esto de otra manera será muy bienvenida.
Muchas gracias
Laura