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 Enviado: miércoles, 15 de marzo de 2017 8:59 Para: r-help-es 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:> tablaSexo 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 [[alternative HTML version deleted]]
Disiento, Javier. R sí es un lenguaje orientado a objetos. :-) Un saludo, Miguel. El 15/03/2017 a las 13:43, javier.ruben.marcuzzi en gmail.com<mailto:javier.ruben.marcuzzi en gmail.com> escribió: 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. ________________________________ Nota: A información contida nesta mensaxe e os seus posibles documentos adxuntos é privada e confidencial e está dirixida únicamente ó seu destinatario/a. Se vostede non é o/a destinatario/a orixinal desta mensaxe, por favor elimínea. A distribución ou copia desta mensaxe non está autorizada. Nota: La información contenida en este mensaje y sus posibles documentos adjuntos es privada y confidencial y está dirigida únicamente a su destinatario/a. Si usted no es el/la destinatario/a original de este mensaje, por favor elimínelo. La distribución o copia de este mensaje no está autorizada. See more languages: http://www.sergas.es/aviso-confidencialidad [[alternative HTML version deleted]]
De hecho, dos de los principios de diseño de R son: 1) Todo lo que existe es un objeto. 2) Todo lo que sucede es una llamada a una función. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El 15 de marzo de 2017, 14:22, <miguel.angel.rodriguez.muinos en sergas.es> escribió:> Disiento, Javier. > > R sí es un lenguaje orientado a objetos. > > :-) > > > Un saludo, > Miguel. > > > > El 15/03/2017 a las 13:43, javier.ruben.marcuzzi en gmail.com<mailto: > javier.ruben.marcuzzi en gmail.com> escribió: > > 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. > > > > > > ________________________________ > > Nota: A información contida nesta mensaxe e os seus posibles documentos > adxuntos é privada e confidencial e está dirixida únicamente ó seu > destinatario/a. Se vostede non é o/a destinatario/a orixinal desta mensaxe, > por favor elimínea. A distribución ou copia desta mensaxe non está > autorizada. > > Nota: La información contenida en este mensaje y sus posibles documentos > adjuntos es privada y confidencial y está dirigida únicamente a su > destinatario/a. Si usted no es el/la destinatario/a original de este > mensaje, por favor elimínelo. La distribución o copia de este mensaje no > está autorizada. > > See more languages: http://www.sergas.es/aviso-confidencialidad > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]
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]]
Mauricio Hay un libro, copio y pego la parte donde dice que R es un lenguaje de programación funcional http://adv-r.had.co.nz/Functional-programming.html#functional-programming , aunque también tiene partes de OOP, etc. Pero no es para principiantes, aunque eso no quita que pueda ser leído hasta por mi. El autor es Hadley Wickham Javier Rubén Marcuzzi De: Mauricio Monsalvo Enviado: miércoles, 15 de marzo de 2017 14:10 Para: Marcuzzi, Javier Rubén CC: r-help-es Asunto: Re: [R-es] Fwd: Crear una función 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 Enviado: miércoles, 15 de marzo de 2017 8:59 Para: r-help-es 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:> tablaSexo 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]]