diff --git a/shiny/shinyApp b/shiny/shinyApp new file mode 100755 index 0000000000000000000000000000000000000000..37e242a522d7178e8bf3f6867821207c46fb5762 --- /dev/null +++ b/shiny/shinyApp @@ -0,0 +1,267 @@ +#!/bin/bash + +##====================================================================== +## Eduardo Junior +## eduardo.jr@ufpr.br +## 13-11-2015 +##====================================================================== +## Facilitando a criacão e execução de aplicações shiny + +DIR=`pwd` +SV=server.R +UI=ui.R + +##====================================================================== +## Funções utilizadas + +_usage() { + cat <<EOF +$* + Uso: shinyApp <command> [<args>] + + init: Inicia uma aplicação shiny no diretório atual + + -o : inicia os arquivos shiny em uma sessão emacs e + executa a função runApp, abrindo o navegador padrão + + -t : cria os arquivos conforme template definido para + o projeto IGUIR2. Obs.: Tenha em um diretório acima da + aplicação (cd ..) o arquivo template.R com função R + chamada template já definida. + + run: Executa uma aplicação shiny, com função runApp + + -o : inicia os arquivos shiny em uma sessão emacs e + executa a função runApp, abrindo o navegador padrão + + diretório: informe o diretório da aplicação shiny + + Example: + + shinyApp init + shinyApp init -t + shinyApp init -o -t + shinyApp init -to + shinyApp run -o + shinyApp run ~/path -o + +EOF +} + +build_App() { + if [ -e "$SV" ] || [ -e "$UI" ]; then + echo "O diretório já contém arquivos ui.R e/ou server.R" + echo -n " Deseja sobrescrever? " + read ANSWER + case "$ANSWER" in + s | sim | y | yes) echo "";; + n | não | no) exit 1;; + * ) echo " Responda com as palavres: yes ou no" + exit 1 + esac + fi + ##------------------------------------------- + # Criando o server.R + echo "##-------------------------------------------" > server.R + echo "## server.R" >> server.R + echo "" >> server.R + echo "library(shiny)" >> server.R + echo "" >> server.R + echo "shinyServer(" >> server.R + echo " function(input, output) {" >> server.R + echo " " >> server.R + echo " }" >> server.R + echo ")" >> server.R + ##------------------------------------------- + # Criando o ui.R + echo "##-------------------------------------------" > ui.R + echo "## ui.R" >> ui.R + echo "" >> ui.R + echo "library(shiny)" >> ui.R + echo "" >> ui.R + echo "shinyUI(" >> ui.R + echo " fluidPage(" >> ui.R + echo " " >> ui.R + echo " )" >> ui.R + echo ")" >> ui.R + ##------------------------------------------- + # Verificando a execução + case $1 in + run) + echo "Criando ui.R e server.R em $DIR" + emacs server.R ui.R & + echo "Pressione ^C para interromper a aplicação" + Rscript -e "shiny::runApp(getwd(), launch.browser = TRUE)" + ;; + *) + echo "Arquivos criados em $DIR" + esac +} + +build_AppTemplate() { + if [ -e "$SV" ] || [ -e "$UI" ]; then + echo "O diretório já contém arquivos ui.R e/ou server.R" + echo -n " Deseja sobrescrever? " + read ANSWER + case "$ANSWER" in + s | sim | y | yes) echo "";; + n | não | no) exit 1;; + * ) echo " Responda com as palavres: yes ou no" + exit 1 + esac + fi + if [ ! -e "../template.R" ]; then + echo "Arquivo template.R não existe! Favor defini-lo no diretório acima." + exit 1 + fi + ##------------------------------------------- + # Criando o server.R + echo "##-------------------------------------------" > server.R + echo "## server.R" >> server.R + echo "" >> server.R + echo "library(shiny)" >> server.R + echo "" >> server.R + echo "## Carrega template das aplicações elaboradas pelo projeto iguiR2" >> server.R + echo "source(\"../template.R\")" >> server.R + echo "" + echo "shinyServer(" >> server.R + echo " function(input, output, session) {" >> server.R + echo " ## Cabeçalho IGUIR2" >> server.R + echo " output\$header <- renderPrint({" >> server.R + echo " template(\"TEMA\")" >> server.R + echo " })" >> server.R + echo " " >> server.R + echo " " >> server.R + echo " }" >> server.R + echo ")" >> server.R + ##------------------------------------------- + # Criando o ui.R + echo "##-------------------------------------------" > ui.R + echo "## ui.R" >> ui.R + echo "" >> ui.R + echo "library(shiny)" >> ui.R + echo "" >> ui.R + echo "shinyUI(" >> ui.R + echo " fluidPage(" >> ui.R + echo " ## Cabeçalho IGUIR2" >> ui.R + echo " htmlOutput(\"header\")" >> ui.R + echo " " >> ui.R + echo " " >> ui.R + echo " )" >> ui.R + echo ")" >> ui.R + ##------------------------------------------- + # Verificando a execução + case $1 in + run) + echo "Criando ui.R e server.R em $DIR" + emacs server.R ui.R & + echo "Pressione ^C para interromper a aplicação" + Rscript -e "shiny::runApp(getwd(), launch.browser = TRUE)" + ;; + *) + echo "Arquivos criados em $DIR" + esac +} + +## Verificando quantidade de argumentos: +if [ $# -eq 0 ] || [ $# -gt 3 ]; then + echo "Número de argumentos incorreto! Consulte shinyApp --help" + exit 1 +fi + +# Daria para usar `getopts` se não houvesse a necessidade de dois comandos +# secundários, init e run. getopts é MUITO MUItO útil para opções do +# tipo -* + +##====================================================================== +## Inicia o script +echo "-------------------------------------------" + +if [ $1 = "init" ]; then + if [ $# -eq 1 ]; then + build_App + elif [ $# -eq 2 ]; then + case $2 in + -h | --help) _usage + ;; + -o) build_App run + ;; + -t) build_AppTemplate + ;; + -ot | -to) build_AppTemplate run + ;; + * ) echo "Argumentos incorretos! Consulte shinyApp --help" + exit 1 + esac + elif [ $# -eq 3 ]; then + if ([ $2 = "-t" ] && [ $3 = "-o" ]) || ([ $2 = "-o" ] && [ $3 = "-t" ]); then + build_AppTemplate run + else + echo "Argumentos inválidos! Consulte shinyApp --help" + exit 1 + fi + fi +elif [ $1 = "run" ]; then + if [ $# -eq 1 ]; then + echo "Executando a aplicação em $DIR" + echo "Pressione ^C para interromper a aplicação" + Rscript -e "shiny::runApp(getwd(), launch.browser = TRUE)" + elif [ $# -eq 2 ]; then + case $2 in + -h | --help) _usage + ;; + -o ) + echo "Executando a aplicação e abrir arquivos no emacs" + emacs server.R ui.R & + echo "Pressione ^C para interromper a aplicação" + Rscript -e "shiny::runApp(getwd(), launch.browser = TRUE)" + ;; + *) + if [ -d $2 ]; then + cd $2 + if [ ! -e "$SV" ] || [ ! -e "$UI" ]; then + echo "Este diretório não contém uma aplicação shiny completa" + echo "Verifique os arquivos server.R e ui.R em $2" + exit 1 + fi + echo "Executando a aplicação em $2" + echo "Pressione ^C para interromper a aplicação" + Rscript -e "shiny::runApp(getwd(), launch.browser = TRUE)" + else + echo "Argumentos inválidos! Consulte shinyApp --help" + exit 1 + fi + esac + elif [ $# -eq 3 ]; then + if [ $2 = "-o" ] && [ -d $3 ]; then + echo "Executando a aplicação em $3" + cd $3 + if [ ! -e "$SV" ] || [ ! -e "$UI" ]; then + echo "Este diretório não contém uma aplicação shiny completa" + echo "Verifique os arquivos server.R e ui.R em $3" + exit 1 + fi + emacs server.R ui.R & + echo "Pressione ^C para interromper a aplicação" + Rscript -e "shiny::runApp(getwd(), launch.browser = TRUE)" + elif [ -d $2 ] && [ $3 = "-o" ]; then + echo "Executando a aplicação em $2" + cd $2 + if [ ! -e "$SV" ] || [ ! -e "$UI" ]; then + echo "Este diretório não contém uma aplicação shiny completa" + echo "Verifique os arquivos server.R e ui.R em $2" + exit 1 + fi + emacs server.R ui.R & + echo "Pressione ^C para interromper a aplicação" + Rscript -e "shiny::runApp(getwd(), launch.browser = TRUE)" + else + echo "Argumentos inválidos! Consulte shinyApp --help" + exit 1 + fi + fi +elif [ $1 = "-h" ] || [ $1 = "--help" ]; then + _usage +else + echo "Argumentos inválidos! Consulte shinyApp --help" +fi diff --git a/shiny/template.R b/shiny/template.R new file mode 100644 index 0000000000000000000000000000000000000000..bf5509d4be9cb1d46f317bb4fbd3b414c8f9bfad --- /dev/null +++ b/shiny/template.R @@ -0,0 +1,67 @@ +template <- function(title) { + ##------------------------------------------- + ## Cria estilo iguir para as tags utilizadas no template + cat(" +<head> +<style> + +table.iguir { + margin-left: auto; + margin-right: auto; + margin-top: 1em; + margin-bottom: 1em; + background-color: rgba(0, 0, 0, 0); + border: none; + border-top: 4px solid #A96CBA; + border-bottom: 4px solid #A96CBA; + border-left: 0px; + border-right: 0px; + border-collapse: collapse; + width: 80%; +} + +td.iguir { + border-bottom: 0px; + border-top: 0px; + border-left: 0px; + border-right: 0px; + padding-left: 20px; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; + background-color: rgba(0, 0, 0, 0); +} + +h1.iguir { + color: black; + background-color: rgba(0, 0, 0, 0); + font-weight: bold; + font-size: 1.8em; + font-family: Ubuntu; +} + +h2.iguir { + color: rgba(83, 83, 83, 0.8); + background-color: rgba(0, 0, 0, 0); + font-weight: bold; + font-size: 1.5em; + font-family: Ubuntu; +} + +</style> +</head>", " + +<table class = 'iguir'> + <td class = 'iguir'> + <h1 class = 'iguir'> + Interactive Graphical User Interface with R - IGUIR + </h1> + <h2 class = 'iguir'>", title, " + </h2> + </td> + <td class = 'iguir' align='right'> + <img src = 'http://200.17.213.89/~eduardo/images/iguir2.svg' height = '128' width = '128'> </img> + </td> +</table>", sep = "\n") +} +