1 Introducción

A la hora de escribir códigos es bastante útil incluir comentarios que ayuden a entender que es lo que se esta realizando en cada sección. Una manera ordenada de escribir código es colocando en un cuadrado formado por ‘hashtags’ el título de la sección. De esta manera no solo facilitamos nuestro propio trabajo a la hora de programar, si no que tambien ayudamos a que nuestros colaboradores, u otras personas, entiendan mejor nuestro código.

La forma de colocar comentarios varia dependiendo del lenguaje que estemos usando para escribir nuestro código. Sin embargo, varios lenguajes usan el ‘hashtag’ para indicar que lo que se encuentra a la derecha es un comentario y la computadora no debe interpretarlo como un comando. En mi caso los programas que más utilizo para escribir códigos son: R y bash, y en menor medida python y perl. Por suerte mia en los 4 lenguajes los comentarios se indican con el uso de ‘hashtags’.

Otro motivo que me llevo a escribir estas funciones fue que a menudo necesito separar los resultados de mis scripts, y a veces el largo de los subtitulos son diferentes o deseo incluir la hora de inicio y fin del programa. Por eso es posible usar una función (como la hora) dentro del título que se desee encuadrar con hashtags.

Encuadrar con ‘#’ los títulos de las secciones del código puede ser tedioso, por lo que escribi una funcíon que me ahorre el trabajo. La función que escribi en R, permite indicarle la cadena de caractéres que se usará como título y algunos parámetros adicionales de ser necesarios. La función que escribi en bash es un poco más sencilla pero cumple con su objetivo.

Acá les dejo algunos ejemplos:

## ################################################## 
## #                    Estilo 1                    #
## ##################################################
## ################################################## 
## ##                                              ##
## ##                   Estilo 2                   ##
## ##                                              ##
## ##################################################
## ################################################## 
## ##                                              ##
## ####                 Estilo 3                 ####
## ##                                              ##
## ##################################################

Primero les dejare el código de la función que escribi en R y luego la de bash, cada una con algunos ejemplos.

2 Función en R

La función requiere mínimo de un argumento que es la cadena de caracteres que se colocará dentro del rectangulo de hashtags. Además se puede incluir algunas variables para indicar por ejemplo el número de hashtags o espacios en blanco que se usarán a los lados. En la siguiente tabla se explican los argumentos disponibles (entre parentesis, los valores default de cada argumento).

Argumento Explicación
titulo Cadena que se colocará dentro del rectangulo de hashtags
lim_titulo (50) Límite del largo del título para usar rectangulo de la misma longitud *
nLHT (1) Número de líneas de hashtags, arriba y abajo del título
nLb (0) Número de líneas con espacios
nRepHT (1) Número de # en el margen de las líneas con espacios
nHTtitulo (1) Número de # al margen de la línea de título
EspacioTitulo (2) Espacio vacio en la linea del titulo
estilo (“E0”) Si es que se desea usar alguno de los 3 (“E1”,“E2” y “E3”) estilos predeterminados

Para hacer uso de la función solo hace falta copiar el siguiente código a su script. Sí, lo sé, es un poco larga la función, pero solamente deben copiarla una vez, incluso despues de ejecutarla y guardarla en su sesión pueden eliminar las líneas. Y luego solo llaman a la función como cualquier otra, en este caso usando hashtagTitulo(). El código de la función es el siguiente:

hashtagTitulo <- function(titulo, lim_titulo = 50, nLHT = 1, nLb = 0, nRepHT = 1, nHTtitulo = nRepHT, EspacioTitulo = 2, estilo = "E0"){
  ################################################## 
  #                Definiendo Estilo               #
  ##################################################
  if (estilo == "E2"){
    lim_titulo = 50
    nLHT = 1
    nLb = 0
    nRepHT = 1
    nHTtitulo = nRepHT
    EspacioTitulo = 2
  }
  if (estilo == "E2"){
    lim_titulo = 50
    nLHT = 1
    nLb = 1
    nRepHT = 2
    nHTtitulo = nRepHT
    EspacioTitulo = 2
  }
  if (estilo == "E3"){
    lim_titulo = 50
    nLHT = 1
    nLb = 1
    nRepHT = 2
    nHTtitulo = 4
    EspacioTitulo = 2
  }
  ####                   fin                    ####
  
  ################################################## 
  #####            Funcion requerida           #####
  ##################################################
  # * luego se eliminara
  cadRep<-function(ttt,charsim){
    for(i in 1:ttt){
      if( i == 1){
        xtwg=charsim #caracter simbolo
      }else{
        xtwg <- paste(xtwg,charsim,sep = "")
      }
    }
    xtwg
  }
  ####                   fin                    ####
  
  ################################################## 
  ####           Calculando longitudes          ####
  ##################################################
  lencad=nchar(titulo)
  lengmax <- lencad+(2*nHTtitulo)+(2*EspacioTitulo)
  if(lengmax <= lim_titulo){
    lengmax <- 50
    #margen <- (48-lencad)-(round((48-lencad)/2))  
    #margenD <- 50-lencad-margen-(2*nHTtitulo) 
    margen <- (lengmax-lencad)-(round((lengmax-lencad)/2))-nHTtitulo 
    margenD <- lengmax-margen-lencad-nHTtitulo-nHTtitulo 
    HT<-cadRep(nHTtitulo,"#") 
    SPIZ<-cadRep(margen," ") 
    SPDE<-cadRep(margenD," ") 
    HTL<-cadRep(50,"#") 
  }else {
    lengmax <- lencad+(2*nHTtitulo)+(2*EspacioTitulo) 
    margen <- (lengmax-lencad)-(round((lengmax-lencad)/2))-nHTtitulo 
    margenD <- lengmax-margen-lencad-nHTtitulo-nHTtitulo 
    HT<-cadRep(nHTtitulo,"#") 
    SPIZ<-cadRep(margen," ") 
    SPDE<-cadRep(margenD," ") 
    HTL<-cadRep(lengmax,"#") 
  }
  ####                   fin                    ####
  
  ################################################## 
  ####             Imprimir titulo              ####
  ##################################################
  if (nLHT > 0){
    for (i in 1:nLHT){
      cat(HTL,"\n")
    }
  }  
  if (nLb > 0){
    SPACE <- lengmax - (nRepHT * 2)
    HASHTAGmargen <- cadRep(nRepHT,"#")
    SPACEline <- cadRep(SPACE," ")
    for (i in 1:nLb){
      cat(HASHTAGmargen,SPACEline,HASHTAGmargen,"\n",sep = "")
    }
  }
  cat(HT,SPIZ,titulo,SPDE,HT,"\n",sep = "")
  if (nLb > 0){
    SPACE <- lengmax - (nRepHT * 2)
    HASHTAGmargen <- cadRep(nRepHT,"#")
    SPACEline <- cadRep(SPACE," ")
    for (i in 1:nLb){
      cat(HASHTAGmargen,SPACEline,HASHTAGmargen,"\n",sep = "")
    }
  }
  if (nLHT > 0){
    for (i in 1:nLHT){
      cat(HTL,"\n")
    }
  }  
  ####                   fin                    ####
}

2.1 Ejemplos

hashtagTitulo(titulo="Ejemplo")
## ################################################## 
## #                    Ejemplo                     #
## ##################################################
hashtagTitulo(titulo = "Ejemplo",nLHT = 2)
## ################################################## 
## ################################################## 
## #                    Ejemplo                     #
## ################################################## 
## ##################################################
hashtagTitulo(titulo = "Ejemplo",nLHT = 1,nLb = 2)
## ################################################## 
## #                                                #
## #                                                #
## #                    Ejemplo                     #
## #                                                #
## #                                                #
## ##################################################
hashtagTitulo(titulo = "Ejemplo",nLHT = 1,nLb = 2,nRepHT = 4)
## ################################################## 
## ####                                          ####
## ####                                          ####
## ####                 Ejemplo                  ####
## ####                                          ####
## ####                                          ####
## ##################################################
hashtagTitulo(titulo = "Ejemplo",nLHT = 1,nLb = 2,nRepHT = 4, nHTtitulo = 1)
## ################################################## 
## ####                                          ####
## ####                                          ####
## #                    Ejemplo                     #
## ####                                          ####
## ####                                          ####
## ##################################################
hashtagTitulo(titulo = "Ejemplo",nLHT = 1,nLb = 2,nRepHT = 4, nHTtitulo = 7)
## ################################################## 
## ####                                          ####
## ####                                          ####
## #######              Ejemplo               #######
## ####                                          ####
## ####                                          ####
## ##################################################
hashtagTitulo(titulo="Ejemplo de título largo, es decir una cadena de más de 50 caractéres")
## ########################################################################## 
## #  Ejemplo de título largo, es decir una cadena de más de 50 caractéres  #
## ##########################################################################
hashtagTitulo(titulo = "Ejemplo de título largo, es decir una cadena de más de 50 caractéres",nLHT = 2)
## ########################################################################## 
## ########################################################################## 
## #  Ejemplo de título largo, es decir una cadena de más de 50 caractéres  #
## ########################################################################## 
## ##########################################################################
hashtagTitulo(titulo = "Ejemplo de título largo, es decir una cadena de más de 50 caractéres",nLHT = 1,nLb = 2)
## ########################################################################## 
## #                                                                        #
## #                                                                        #
## #  Ejemplo de título largo, es decir una cadena de más de 50 caractéres  #
## #                                                                        #
## #                                                                        #
## ##########################################################################
hashtagTitulo(titulo = "Ejemplo de título largo, es decir una cadena de más de 50 caractéres",nLHT = 1,nLb = 2,nRepHT = 4)
## ################################################################################ 
## ####                                                                        ####
## ####                                                                        ####
## ####  Ejemplo de título largo, es decir una cadena de más de 50 caractéres  ####
## ####                                                                        ####
## ####                                                                        ####
## ################################################################################
hashtagTitulo(titulo = "Ejemplo de título largo, es decir una cadena de más de 50 caractéres",nLHT = 1,nLb = 2,nRepHT = 4, nHTtitulo = 1)
## ########################################################################## 
## ####                                                                  ####
## ####                                                                  ####
## #  Ejemplo de título largo, es decir una cadena de más de 50 caractéres  #
## ####                                                                  ####
## ####                                                                  ####
## ##########################################################################
hashtagTitulo(titulo = "Ejemplo de título largo, es decir una cadena de más de 50 caractéres",nLHT = 1,nLb = 2,nRepHT = 4, nHTtitulo = 7)
## ###################################################################################### 
## ####                                                                              ####
## ####                                                                              ####
## #######  Ejemplo de título largo, es decir una cadena de más de 50 caractéres  #######
## ####                                                                              ####
## ####                                                                              ####
## ######################################################################################
hashtagTitulo(titulo = "Ejemplo de título largo, es decir una cadena de más de 50 caractéres",nLHT = 1,nLb = 2,nRepHT = 4, nHTtitulo = 7,EspacioTitulo = 8)
## ################################################################################################## 
## ####                                                                                          ####
## ####                                                                                          ####
## #######        Ejemplo de título largo, es decir una cadena de más de 50 caractéres        #######
## ####                                                                                          ####
## ####                                                                                          ####
## ##################################################################################################

Cuando se quiere agregar una función denttro del título:

hashtagTitulo(titulo = paste("La hora de inicio es:",Sys.time(),"fin"))
## ################################################### 
## #  La hora de inicio es: 2018-02-08 11:32:33 fin  #
## ###################################################

3 Función en Bash

3.1 Programa

El programa que escribi en bash es bastante más sencillo, la verdad es que por el momento me es más sencillo trabajar en R. Sin embargo, cumple con su objetivo. A diferencia de la función de R, en este caso no podemos modificar todos los parámetros y solo tenemos para elegir dos estilos. En este caso estribi primero un pequeño programa y luego extraje los comandos y los volví función, para ser usados dentro de algun script sin tener la necesidad de guardar el programa en la computadora. Primero les presentare el programa.

Para los que tengan un poco de experiencia en bash les sera sencillo hacer uso del programa. Y si no tienen mucha experiencia, no se asusten que es bastante sencillo. Lo primero que tienen que hacer es copiar el código del programa en un editor de texto (por ejemplo: gedit) y guardarlo tal cual (un ejemplo del nombre podría ser “hashtagtitulo.sh”). Luego a travez de la terminal, debemos dirigirnos al directorio en el cual hemos guardado el archivo. Una vez alli debemos cambiar los permisos del archivo, si no tienen experiencia en linux podria ser algo complicado, pero la verdad es que es bastante fácil. Basta con hacer uso del comando chmod, en nuestro caso bastaria con ejecutar el siguiente comando: $ chmod 755 <nombre_de_tu_archivo>. Ahora nuestro archivo ya es ejecutable y si estamos en el directorio del archivo y desde el terminal podemos escribir ./hashtagtitulo.sh para abrir el pequeño programa. Si se desea ejecutar el programa desde cualquier directorio se debera guardarlo en la carpeta ‘bin’ o exportarlo al PATH, les dejo esa tarea.

El código del programa en bash es el siguiente:

#!/bin/bash

# Definir funciones y variables
TEXTOTI=$1
ESTILO=$2

# Menu de ayuda #
# Ayuda larga
function help(){
echo """
Este script necesita de dos argumentos:
  $0 <texto_titulo> <estilo>

Los argumentos se deven introducir de la siguiente forma:
  <texto_titulo>  "titulo entre comillas"
  <estilo> numero+E

Ejemplo 1:

  $0 \"Ejemplo 1\" 1E

  Resultado:
  ###############
  #  Ejemplo 1  #
  ###############

  Ejemplo 2:

  $0 \"Ejemplo 2\" 2E

  Resultado:
  #################
  ##             ##
  ##  Ejemplo 2  ##
  ##             ##
  #################
  """
exit
}
# ayuda corta
function helpc(){
echo """
Introdusca correctamente la orden:
$0 <texto_titulo> <estilo>

Pedir ayuda con "$0 -h" o "$0 --help"
  """
exit
}
# fin #
# solicitando ayuda
if [[ -z $1 ]]; then
helpc
fi
if [[ $1 == "-h" || $1 == "--help" || $2 != [1:2]E ]]; then
help
fi
# ESTILO 1
if [[ $ESTILO == 1E ]]; then
o1=######
echo "$TEXTOTI$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
echo "#  $TEXTOTI  #"
echo "$TEXTOTI$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
fi
# ESTILO2
if [[ $ESTILO == 2E ]]; then
o1=########
o2="##  "
o3="  ##"
vlim=$(echo "$TEXTOTI" | sed 's/[0-9]/ /g' | sed 's/[a-z]/ /g' | sed 's/[A-Z]/ /g' | sed 's/[[:punct:]]/ /g')
echo "$TEXTOTI$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
echo "$o2$vlim$o3"
echo "##  $TEXTOTI  ##"
echo "$o2$vlim$o3"
echo "$TEXTOTI$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
fi
# FIN #

3.2 Función dentro de un programa

En ocasiones necesitaremos hacer uso de la función dentro de algun programa. Yo la utilizo generalmente para indicar los diferentes resultados de un programa, y ayudarme a separar e identificar cada uno. Si necesito enviar el script a otra persona, es más sencillo incluir en el script la función que genere el título dentro del rectangulo de hahstags, que enviarle un archivo a parte con el programa anterior. Por esto coloco aqui dos funciones (una para cada estilo) que pueden ser usadas dentro de sus scripts. Solo hace falta colocarlas en la parte superior de sus scripts y luego llamarlas.

Función con el estilo de título 1:

function titulo1 (){
    o1=######
    echo "$1$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
    echo "#  $1  #"
    echo "$1$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
}

Función con el estilo de título 2:

function titulo2 (){
    o1=########
  o2="##  "
  o3="  ##"
  vlim=$(echo "$TEXTOTI" | sed 's/[0-9]/ /g' | sed 's/[a-z]/ /g' | sed 's/[A-Z]/ /g' | sed 's/[[:punct:]]/ /g')
  echo "$TEXTOTI$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
  echo "$o2$vlim$o3"
  echo "##  $TEXTOTI  ##"
  echo "$o2$vlim$o3"
  echo "$TEXTOTI$o1" | sed 's/[0-9]/#/g' | sed 's/[a-z]/#/g' | sed 's/[A-Z]/#/g' | sed 's/ /#/g'| sed 's/[[:punct:]]/#/g'
}

3.3 Ejemplos

./hashtagtitulo.sh 
## 
## Introdusca correctamente la orden:
## ./hashtagtitulo.sh <texto_titulo> <estilo>
## 
## Pedir ayuda con ./hashtagtitulo.sh -h o ./hashtagtitulo.sh --help
## 

Pedir ayuda:

./hashtagtitulo.sh -h 
## 
## Este script necesita de dos argumentos:
##   ./hashtagtitulo.sh <texto_titulo> <estilo>
## 
## Los argumentos se deven introducir de la siguiente forma:
##   <texto_titulo>  titulo entre comillas
##   <estilo> numero+E
## 
## Ejemplo 1:
## 
##   ./hashtagtitulo.sh "Ejemplo 1" 1E
## 
##   Resultado:
##   ###############
##   #  Ejemplo 1  #
##   ###############
## 
##   Ejemplo 2:
## 
##   ./hashtagtitulo.sh "Ejemplo 2" 2E
## 
##   Resultado:
##   #################
##   ##             ##
##   ##  Ejemplo 2  ##
##   ##             ##
##   #################
## 

Ejemplo estilo 1:

./hashtagtitulo.sh "Ejemplo, estilo 1" 1E
## #######################
## #  Ejemplo, estilo 1  #
## #######################

Ejemplo estilo 2:

./hashtagtitulo.sh "Ejemplo, estilo 2" 2E
## #########################
## ##                     ##
## ##  Ejemplo, estilo 2  ##
## ##                     ##
## #########################

Ejemplo usando una función dentro del título:

./hashtagtitulo.sh "La hora de inicio es: `date`" 2E
## ##########################################################
## ##                                                      ##
## ##  La hora de inicio es: Thu Feb  8 11:32:33 -05 2018  ##
## ##                                                      ##
## ##########################################################

4 DEVTOOLS

## Session info -------------------------------------------------------------
##  setting  value                       
##  version  R version 3.4.3 (2017-11-30)
##  system   x86_64, linux-gnu           
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  tz       America/Lima                
##  date     2018-02-08
## Packages -----------------------------------------------------------------
##  package   * version date       source        
##  backports   1.1.2   2017-12-13 CRAN (R 3.4.3)
##  base      * 3.4.3   2017-11-30 local         
##  compiler    3.4.3   2017-11-30 local         
##  datasets  * 3.4.3   2017-11-30 local         
##  devtools    1.13.4  2017-11-09 CRAN (R 3.4.3)
##  digest      0.6.15  2018-01-28 CRAN (R 3.4.3)
##  evaluate    0.10.1  2017-06-24 CRAN (R 3.4.3)
##  graphics  * 3.4.3   2017-11-30 local         
##  grDevices * 3.4.3   2017-11-30 local         
##  htmltools   0.3.6   2017-04-28 CRAN (R 3.4.3)
##  knitr       1.19    2018-01-29 CRAN (R 3.4.3)
##  magrittr    1.5     2014-11-22 CRAN (R 3.4.3)
##  memoise     1.1.0   2017-04-21 CRAN (R 3.4.3)
##  methods   * 3.4.3   2017-11-30 local         
##  Rcpp        0.12.15 2018-01-20 CRAN (R 3.4.3)
##  rmarkdown   1.8     2017-11-17 CRAN (R 3.4.3)
##  rprojroot   1.3-2   2018-01-03 CRAN (R 3.4.3)
##  stats     * 3.4.3   2017-11-30 local         
##  stringi     1.1.6   2017-11-17 CRAN (R 3.4.3)
##  stringr     1.2.0   2017-02-18 CRAN (R 3.4.3)
##  tools       3.4.3   2017-11-30 local         
##  utils     * 3.4.3   2017-11-30 local         
##  withr       2.1.1   2017-12-19 CRAN (R 3.4.3)
##  yaml        2.1.16  2017-12-12 CRAN (R 3.4.3)