[R-es] Fwd: Crear una función

Mauricio Monsalvo m.monsalvo en gmail.com
Mie Mar 15 18:10:25 CET 2017


Muchas gracias por tus aportes, Javier.
¿Un texto humanamente legible y gratuito sobre funciones para recomendar a
la lista se te ocurre?

El 15 de marzo de 2017, 9:43, <javier.ruben.marcuzzi en gmail.com> escribió:

> 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:
>
> > tabla
>
>    Sexo   N Porc PorcAc  NEA  NOA Nacionales Provinciales Municipales
> Comunitarios Religiosos Privados
>
> 1 Mujer 270 86.8   86.8 92.7 84.2       77.8         89.6        83.8
>     78.9         90      100
>
> 2 Varon  40 12.9   99.7  7.3 15.3       22.2         10.4        16.2
>     19.3         10       NA
>
> 3  <NA>   1  0.3  100.0   NA  0.5         NA           NA          NA
>       NA         NA       NA​
>
> ​Pero como tengo que hacerlo muchas veces, necesitaría poder escribir esta
> (mi primera) función. Ahorraría mucho tiempo, además ​de asegurarme que no
> pifio en el copiar y pegar y reemplazar.
>
> ​Adjunto datos de prueba y una tabla con los las variables y sus
> variable.labels (nombres).
>
> ​Se usa:
>
> library(data.table)
>
> library(tidyverse) # library(dplyr)
>
> library(stringr)
>
> Muchas gracias.
>
> Saludos.
>
>
>
> --
>
> Mauricio
>
>
>
>
>
> --
>
> Mauricio
>
>
>



-- 
Mauricio

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es