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.
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 ####
}
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 #
## ###################################################
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 #
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'
}
./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 ##
## ## ##
## ##########################################################
## 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)