08 - Escribir funciones

François Rebaudo, IRD francois.rebaudo@ird.fr

Marzo 2019 ; PUCE-Quito-Ecuador http://myrbooksp.netlify.com/

CC BY-NC-ND 3.0

Función simple

Función simple

masDos es un objeto de tipo función (function). Tiene un solo argumento x. El resultado de la función corresponde a return(). Si no hay return(), R toma como resultado el ultimo calculo.

masDos <- function(x){
  return(x + 2)
}
masDos(x = 5)
## [1] 7

Función mas compleja

vocales y consonantes

Una función que contará el número de consonantes y vocales en un texto.

# countVowelConso("mi texto")
# conso  voca 
#     4     3 

vocales y consonantes

  1. tener un texto

Lenín Moreno ; Davos - Suiza, enero 22 de 2019 https://www.presidencia.gob.ec/discursos/

miTexto <- "Buenas noches. Yo creo que si hay algo que diferencia al Ecuador de los otros países, es la extraordinaria diversidad que tiene en un pequeño territorio. El Ecuador tiene riquezas por encima y por debajo de su suelo: Por encima: una diversidad arquitectónica; una diversidad en su clima; una diversidad en su paisaje, en su fauna, en su flora, en sus etnias inclusive. Cuando se recorre Ecuador, hay diversidad de vestimenta, diversidad de folclor, de música, diversidad de gastronomía. Una extraordinaria megadiversidad. Es probable que no me equivoque al decir que somos el país más megadiverso del mundo en proporción a su tamaño. Y por debajo de su suelo, una riqueza extraordinaria: tenemos minerales como el cobre, muy seguramente el 13 ó 14% de la reserva mundial de cobre está en el Ecuador. Tenemos petróleo, ya lo mencionaba Luis Alberto (Moreno, presidente del BID); tenemos oro, mucho oro, a tal punto que han proliferado los mineros artesanales y el gobierno está tratando de poner en orden aquello. Pero sobre todo, para atraer las inversiones tenemos un país que está ávido de recibir capitales del mundo para poder desarrollar actividades turísticas, mineras, productivas varias. Tenemos varias ventajas: estabilidad política, estabilidad económica —esto lo determina nuestro sistema dolarizado—, y sobre todo seguridad jurídica para garantizar que las leyes y normas no vayan a cambiar, a tal punto de que los inversionistas puedan sentirse seguros de invertir en Ecuador."
miTexto <- gsub("á", replacement = "a", miTexto)
miTexto <- gsub("í", replacement = "i", miTexto)
miTexto <- gsub("ñ", replacement = "n", miTexto)
miTexto <- gsub("ó", replacement = "o", miTexto)
miTexto <- gsub("ú", replacement = "u", miTexto)
miTexto <- gsub("\\—|,|;|:|\\.|\\(|\\)|%", replacement = "", miTexto)

vocales y consonantes

  1. transformar un objeto character en un vector de tamaño correspondiente al numero de caracteres en el texto.
textoSplit <- strsplit(miTexto, split = "")[[1]]
length(textoSplit)
## [1] 1447

vocales y consonantes

Comprobamos que no queda caracteres especiales.

table(textoSplit)
## textoSplit
##       1   3   4   a   A   b   B   c   C   d   D   e   E   f   g   h   i 
## 235   2   1   1 137   1  15   2  34   1  80   1 158   7   5   9   5  93 
##   I   j   l   L   m   M   n   o   p   P   q   r   s   t   T   u   U   v 
##   1   5  47   1  33   1  77 105  25   2  16 100  92  52   2  58   1  23 
##   x   y   Y   z 
##   3  10   2   4

vocales y consonantes

  1. numerar consonantes y vocales
vocal <- c("a", "e", "i", "o", "u", "y", 
  "A", "E", "I", "O", "U", "Y")
conso <- c(letters[!letters %in% vocal], 
  LETTERS[!LETTERS %in% vocal])

vocales y consonantes

numVocal <- length(textoSplit[textoSplit %in% vocal])
numConso <- length(textoSplit[textoSplit %in% conso])
print(numVocal)
## [1] 573
print(numConso)
## [1] 635

vocales y consonantes

  1. hacer la función
countVowelConso <- function(miTexto){
  miTexto <- gsub("á", replacement = "a", miTexto)
  miTexto <- gsub("í", replacement = "i", miTexto)
  miTexto <- gsub("ñ", replacement = "n", miTexto)
  miTexto <- gsub("ó", replacement = "o", miTexto)
  miTexto <- gsub("ú", replacement = "u", miTexto)
  miTexto <- gsub("é", replacement = "e", miTexto)
  miTexto <- gsub("\\—|,|;|:|\\.|\\(|\\)|%|“|”|\\-", replacement = "", miTexto)
  textoSplit <- strsplit(miTexto, split = "")[[1]]
  vocal <- c("a", "e", "i", "o", "u", "y", 
    "A", "E", "I", "O", "U", "Y")
  conso <- c(letters[!letters %in% vocal], 
    LETTERS[!LETTERS %in% vocal])
  numVocal <- length(textoSplit[textoSplit %in% vocal])
  numConso <- length(textoSplit[textoSplit %in% conso])
  return(c(conso = numConso, voca = numVocal))
}

vocales y consonantes

  1. probar la función
countVowelConso(miTexto)
## conso  voca 
##   635   573

vocales y consonantes

  1. probar la función otra vez
otroTexto <- "Un esfuerzo extraordinario que en los dos últimos años ha realizado el Ministerio del Interior, que maneja la Policía y seguridad, ha permitido que la tasa de homicidios disminuya. Sin embargo, dentro de esta buena noticia hay una mala: en la tasa de homicidios, ha crecido la tasa de femicidios. Esto se debe —entendemos— a una costumbre atávica que, generalmente, tenemos los latinos: creer que la mujer es posesión de uno. Y el momento en que ella toma alguna decisión enmarcada en las últimas conquistas de sus derechos, el hombre piensa que algo que le pertenecía le ha sido arrebatado. Y, a veces, toma decisiones extremadamente trágicas. Para remediar en lo posible esta situación, sin duda está la tarea de promover y promocionar valores y su práctica. Sobre todo en los niños, mediante la enseñanza de derechos humanos y de valores, desde la primera infancia. Para que desde esas etapas se vayan acostumbrando a la idea de que la mujer tiene el derecho de elegir. Eso va a ayudar muchísimo para disminuir la tasa de femicidios. Sin duda, hay otros aspectos que inciden en la tasa de homicidios, como es la criminalidad vinculada principalmente al narcotráfico. Eso también está siendo combatido de forma muy denodada, mediante una acción efectiva del Ministerio de Defensa y del Ministerio del Interior. Estamos preocupados porque el consumo de droga ha crecido. Eso es preocupante y estamos solucionándolo también —vuelvo a recalcar—, mediante la promoción de valores. Sobre todo, inculcando a niños y jóvenes que se identifiquen con las cosas maravillosas de la vida, para que no tengan la necesidad de acudir a la alternativa de buscar sustitutos miserables, como la droga."
countVowelConso(otroTexto)
## conso  voca 
##   718   652
ultimoTexto <- "Antes del evento electoral en el cual triunfó el presidente Maduro, Ecuador había pedido que ese evento se haga bajo los cánones de la democracia: Que haya una amplia participación y no sea excluida la oposición, que no haya las “trampillas” que suele haber en los denominados sistemas democráticos en más de una ocasión. Y que haya la observación internacional, lo más amplia que se pueda, para poder verificar de forma imparcial si esos triunfos electorales eran válidos o no. Y apelábamos —como de costumbre lo hacemos porque lo hemos implementado como política de gobierno— al diálogo entre las partes, para que la solución sea pacífica. Lastimosamente, la respuesta fue negativa. E inmediatamente como resultado de aquello -creo yo-, inició un éxodo de más de dos millones de venezolanos hacia algunos países, principalmente a Colombia, Ecuador, Perú y Chile. A Ecuador han llegado aproximadamente un millón de migrantes venezolanos, y se han quedado 150 mil, a los cuales hemos respetado plenamente sus derechos, les hemos proporcionado educación, salud, trabajo. Y por supuesto, hemos apelado al gobierno venezolano para que solucione esa crisis humanitaria. Aproximadamente 6 mil hermanos venezolanos por día estaban ingresando al Ecuador hace 3 ó 4 meses. Así lo manifesté yo en las Naciones Unidas y el ministro de Comunicación de Venezuela me dijo que yo había mentido, que no eran 6 mil diarios sino solamente 5 mil quinientos. Eso no me asombró, porque todos sabemos los problemas en matemáticas que suele tener el ministro de Comunicación. O si no, recuerden el “problema de las pizzas”, que lo resolvió con tanta sobriedad académica. El presidente Alvarado y el presidente Abdo lo han dicho de manera concreta: hay que resolverlo entre todos. Entre todos. No creo en los intervencionismos militares, pero sí en aquellos intervencionismos en los cuales uno apela a que se respeten los derechos humanos de los ciudadanos, cosa que no está pasando —lastimosamente— en la hermana república de Venezuela. Nosotros aspiramos a que el gobierno venezolano sea sensible, que la oposición también sea sensible. Y que acudan al diálogo como el mejor mecanismo para resolver las controversias, y poder encaminar verdaderamente por un sendero democrático al querido pueblo venezolano."
countVowelConso(ultimoTexto)
## conso  voca 
##   977   887

vocales y consonantes

  1. probar la función otra vez
textoCompleto <- paste(miTexto, otroTexto, ultimoTexto)
countVowelConso(textoCompleto)
## conso  voca 
##  2330  2112

vocales y consonantes

  1. modificar la función
countLetras <- function(miTexto){
  miTexto <- gsub("á", replacement = "a", miTexto)
  miTexto <- gsub("í", replacement = "i", miTexto)
  miTexto <- gsub("ñ", replacement = "n", miTexto)
  miTexto <- gsub("ó", replacement = "o", miTexto)
  miTexto <- gsub("ú", replacement = "u", miTexto)
  miTexto <- gsub("é", replacement = "e", miTexto)
  miTexto <- gsub("\\—|,|;|:|\\.|\\(|\\)|%|“|”|\\-|[0-9]| ", 
    replacement = "", miTexto)
  miTexto <- tolower(miTexto)
  textoSplit <- strsplit(miTexto, split = "")[[1]]
  return(table(textoSplit))
}
countLetras(textoCompleto)
## textoSplit
##   a   b   c   d   e   f   g   h   i   j   l   m   n   o   p   q   r   s 
## 524  56 168 250 610  21  30  47 325  13 224 169 305 427 103  57 275 340 
##   t   u   v   x   y   z 
## 185 182  61   9  44  17

vocales y consonantes

sort(countLetras(textoCompleto), decreasing = TRUE)
## textoSplit
##   e   a   o   s   i   n   r   d   l   t   u   m   c   p   v   q   b   h 
## 610 524 427 340 325 305 275 250 224 185 182 169 168 103  61  57  56  47 
##   y   g   f   z   j   x 
##  44  30  21  17  13   9

vocales y consonantes

  1. valores por defecto
countLetras <- function(miTexto = "mi texto"){
  #...
}

Funciones de la comunidad

Los paquetes

Casi todas las funciones ya existen … consulte la documentación e Internet antes de embarcarse en la redacción de una nueva función. La mayoría están en paquetes.

install.packages("devRate") para instalar

library("devRate") para usar

Los paquetes

pkgCheck <- function(packages){
    for(x in packages){
        try(if (!require(x, character.only = TRUE)){
            install.packages(x, dependencies = TRUE)
            if(!require(x, character.only = TRUE)) {
                stop()
            }
        })
    }
}
pkgCheck(c("devRate"))

¡Portabilidad!

SIGUIENTE