Estimado Mauricio Monsalvo
R es un lenguaje medio complicado, no es orientado a objetos, aunque hay
formas para un trabajo con objetos, por otro lado se puede definir una
función o emplear 5 paquetes para lo mismo en dos lÃneas de código.
Usted tiene 1500 lÃneas de código, no es fácil de comprenderlas, tampoco
hay recetas mágicas.
Yo ordenarÃa como si fuesen cajas, una entrada, un proceso dentro de la
caja, una salida. Cada caja hace algo, de la forma que usted desea. Luego
las apila para llegar desde el piso al techo que desea. Si hay un cambio
puede reemplazar una caja por otra.
Ahora, posiblemente, aunque no es certero, pienso que usted puede crear
esas cajas por separado y no tiene problemas, pero al juntarlas en una
función aparecen los inconvenientes, una opción es utilizar ciclos for
anidados (o el bucle que desea) con condicionales para distintos casos si
es necesario. Pienso extrapolando algunas experiencias que tuve, pero
desconozco si es aplicable a su caso.
Yo prefiero por secciones de código pequeñas, porque también me paso que
voy probando, corriendo código que coloca cosas en la memoria, pero resulta
que eso que fue a la memoria es de un código obsoleto, y luego al dÃa
siguiente en la nueva sesión de R no corre como se pensaba porque la
memoria no es la misma y encontrar el error es un rompedero de cabeza.
Lo que usted nombra en el resultado de la etiqueta sexo, si lo separa en
bloques solo se preocuparÃa en solucionar la forma de salida desde
data.table, es mucho más sencillo y cualquiera puede aportar algo a meterse
dentro de una función escrita por otro.
Javier Rubén Marcuzzi
*De: *Mauricio Monsalvo <m.monsalvo en gmail.com>
*Enviado: *miércoles, 15 de marzo de 2017 8:59
*Para: *r-help-es <r-help-es en r-project.org>
*Asunto: *[R-es] Fwd: Crear una función
Gracias, Javier.
Es una buena orientación. ¿Qué criterio utilizarÃas para aislar las
funciones? ¿Cada una que crea un objeto es una función en sà misma, que
luego puede ser llamada por otra? Me parece más eficiente y seguro es más
sencillo de mantener, pero con poco práctica en funciones me pareció un
camino a evitar...
Aprovecho y adjunto los archivos que en el anterior no lo habÃa hecho y
también corrijo un error de transcripción.
En este momento, más allá del interés de aprender y mejorar la forma de
encarar estos problemas (tengo más de 1500 lÃneas de código que puedo
resumir con esta función), el principal problema que veo es que no logro
que el objeto etiqueta, que en la segunda lÃnea asigna un factor al
parámetro y sea luego el nombre que aparece en las variables datos[, .N, by
= .(etiqueta =
?x
)], porque el data.table "nombra" esa variable como etiqueta (literal) en
lugar de utilizar el factor ("Sexo", en el ejemplo) asignado
?a
etiqueta <- "Sexo".-
Espero se entienda...
---------- Mensaje reenviado ----------
De: *Mauricio Monsalvo* <m.monsalvo en gmail.com>
Fecha: 15 de marzo de 2017, 7:21
Asunto: Crear una función
Para: r-help-es <r-help-es en r-project.org>
Hola.
Estoy intentando crear una función pero no logro que termine de cerrar y
mi manejo no permite que el google me ayude...
n.reg.dep <- function(x, y) {
??
etiqueta <- str_replace(nombres[Variable == y, Descripcion], "[ ]", "")
tabla <- datos[, .N, by = .(etiqueta =
?x
)] #
tabla <- tabla[, Porc := round(N/sum(N)*100,1)] # %
tabla[, PorcAc := cumsum(Porc)]
# Regiones
tabla.1 <- datos[, .N, by = .(etiqueta = x, Region)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Region)]
tabla.1 <- spread(tabla.1[, .(etiqueta, Region, Porc)], key =
Region, value = Porc)
tabla.reg <- left_join(tabla, tabla.1)
# Depdendencia
tabla.1 <- datos[, .N, by = .(etiqueta = x, Dependencia = B2a)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Dependencia)] # %
por Dependencia
tabla.1 <- na.omit(tabla.1)
tabla.1 <- spread(tabla.1[, .(etiqueta, Dependencia, Porc)], key
= Dependencia, value = Porc)
tabla.dep <- left_join(tabla, tabla.1)
tabla <- left_join(tabla.reg, tabla.dep)
return(tabla)
}
n.reg.dep(datos$A3a, "A3a")
n.reg.dep(datos$A3a)
?Si bien anda y el resultado es bastante parecido al que espero, no puedo
hacer que las tablas se llamen como quisiera porque el factor "etiqueta"
que deberÃa indicar el primer nombre de la variable no es consdierado, como
podrán ver.
?Si correo el código para la variable, resulta algo como: