Aplicações “Shiny”, um primeiro contato usando o RStudio

March 5, 2017 no comments Posted in Análise de Dados

Um tema que me empolga bastante e que venho falando há tempo com amigos é sobre o quão interessante é o pacote/framework Shiny para a publicação de aplicações interativas na web com código R.
 
O Shiny, desenvolvido pelo time do RStudio, traz um novo alcance para o compartilhamento de aplicações interativas em R para quem não necessariamente queira se envolver com a curva de aprendizado para dominar a publicação para a web. O custo obviamente não é zero, teremos que aprender a linguagem do Shiny, mas se você não tem pretensões de desenvolvedor web, ele é para você e para ‘mim’. 🙂

Após alguma prática com o Shiny você talvez conclua junto comigo que algumas das comparações com o Python nem sempre são muito objetivas, não por um viés proposital ou maldoso, mas por desconhecer o que pode ser produzido com R+RStudio+Shiny.

Desconsiderar o trio (R+RStudio+Shiny) como um todo faz a comparação ser bem enviesada contra o ‘R’, o que não implica que eu não entenda as vantagens e desvantagens das 2 abordagens dependendo da formação e interesse do usuário. Por sinal tambem sou usuário de Pyhton, mas me incomoda um pouco algumas comparações que vejo por ai.
 
A minha empolgação com ele é tal que tenho a ousadia de dividir mundo R em 2 grandes eras: antes e depois dos avanços introduzidos pelo RStudio.
 
Pretensões de grandeza à parte, vamos dar uma olhada no que podemos fazer com o Shiny?

 

Vamos começar?

Se você já tem a versão mais recente do RStudio, acima da 1.0, pode testar o que é uma aplicação Shiny de forma muito direta.  File > New File > Shiny Web App

 

Na próxima tela você deve selecionar o nome da aplicação, o tipo e o diretório. O tipo é se toda aplicação ficará definida em um único arquivo ou dois arquivos.

E aqui o conceito chave do Shiny, uma aplicação é composta por 2 componentes, a Interface que será definida no seção UI (User Interface) e o Server responsável pela lógica da aplicação.

No módulo UI teremos os controles entrada como botões, campos de entrada de texto, caixas de seleção

 

(figura extraída do tutorial de Shiny ‘Add control widgets‘)

 E controles de exibição, ou output como áreas para gráficos, tabelas ou textos.

Na aplicação padrão gerada pelo RStudio teremos uma aplicação semelhante a da figura abaixo que exibe um histograma com dados dos tempos de espera entre erupções de geiser ‘Old Faithfull’ do parque Yellowstone nos EUA.

Temos 3 controles, um para exibir o título do “painel”, ‘Old Faithful Geyser Data’, um controle deslizante onde o usuário pode selecionar a quantidade de classes que deseja particionar o histograma e uma área de exibição do histograma. Basta deslizar o controle e o histograma é refeito.

O código padrão gerado pelo Rstudio é o que vai a seguir.

A interface. ui.R

 

e aqui o lado servidor, server.R

Veja que se removermos os comentários o que sobra de linhas de código é realmente muito pouco para o resultado que obtemos.

Bem vamos executar o nosso app Shiny. Observe na aba de scripts do RStudio que quando estamos em um script Shiny ele se altera para Run App. Basta um clique e …

e o seu navegador padrão é chamado com um servidor shiny localhost executando em uma porta específica, aqui no meu 4493.

Experimente deslizar a barra em ‘Number of bins’.

Agora visualize o cenário:  você estar em um empresa/instituição onde cada máquina tenha um IP fixo ou nome e não haja firewalls bloqueando essa porta, você poderia nesse caso apenas passar o endereço para outros colegas do seu grupo de trabalho e compartilhar a sua aplicação na intranet. Em tempo a página é responsiva, ou seja se adapta a outos dispositivos como tablets e ‘espertofones’.

Outra curiosidade é o código que gerado pelo Shiny para que tivessemos uma página web?  Veja opção ‘código fonte’ do seu navegador. No meu Chrome basta clicar com o botão direito do mouse na página e selecionar a opção VIEW PAGE SOURCE.

e voi lá, a página web gerada automáticamente sem qualquer conhecimento prévio de HTML, CSS etc e tal.

 

Ok, mas como publicar na intranet/internet?

2 opções principais:  Usar a hospedagem gratuita/paga http://www.shinyapps.io/

Ou instalar em um servidor Linux hospedado e conectado a internet, o que vai exigir o suporte ou o conhecimento de Linux para que instalar e configurar o servidor Shiny, só disponível como executável para algums distribuições como o Ubuntu e o CentoOS, mas o sensacional é que é gratuito.

Entretanto para empresas é pago, mas existem descontos para pequena empresas e instituições de ensino e pesquisa.

Em um próximo post irei experimentar o SHINYAPPS.IO e relatar a experiência.

E para finalizar aqui uma versão levemente modificada da aplicação padrão shiny criada pelo RStudio com textos e alguns comentários em português.

Antes algumas explicações sobre os dados e a lógica do programinha.

Interface

A interface é definida no arquivo ui.R e aplicação deve ficar definida na função

A interface define uma página web e é composta a partir por ‘layouts’ pré-definidos. Um deles é FluidPage que irá criar um layout composto por linhas e colunas e o mais interessante, responsivo, ou seja se adapta ao dispositivo.

Você pode controlar a quantidade de linhas e colunas e os elementos que irão ser exibidos em cada célula, mas é muito mais fácil ao começar, usar um sub-layout já pronto, um deles é o sidebarLayout. Basicamente uma página com um menu do lado esquerdo e um painel principal do lado direito.

A seguir removi os controles e deixei apenas os componentes de layout para facilitar a visualização.

Apesar dos vários parentesis que as vezes são um problema, a estrutura da página que estamos construindo fica mais óbvia.

Nessa caso temos uma interface que adota o ‘fluidPage’ como estrutura básica, dentro dela uma painel para o Título da Página (titlePage). Depois um sublayout chamado sidebarLayout, ou seja um layout com uma barra lateral e um painel principal. Por fim, dentro dessa área, as áreas para os componentes que vão na barra lateral e no painel principal.

Na versão em português que vem completa ao final temos esse trecho de código onde especificamos o controle de barra deslizando ( sliderInput ). O sliderInput tem um ID ou nome e este é “intervalos”,  o parâmetro seguinte é o label ou texto que será exibido ao lado do controle (“Quantidade de Intervalos:”), a seguir o valor mínimo em min=1, o máximo em max=50 e o valor default ou padrão em value=30).

Já o painel principal é super simples. Apenas um componente do tipo ‘plotOutput’ cujo id ou nome é “distPlot”. Os nomes podem ser alterados a gosto pelo usuário, o tipo de componente são pois são os próprios controles, mas uma vez alterado o nome ou id de um componente você terá que alterar o código do seu server.R de modo correspondente.

Agora podemos nos voltar para a lógica no script server.R, onde a mágica acontece.

Novamente vou despir o código para captarmos a estrutura como um todo.

No lado lógica estamos definindo funções que irá afetar a interface definida em ui.R. Observe o uso das chaves { e } .

O que estamos especificando aqui é a lógica da função que irá gerar uma saída para o componente da interface de nome ‘distPlot’

A tradução literal do que o renderPlot faz seria “Renderiza um gráfico reativo que é adequado para atribuição a um slot de saída.” . Traduzindo, essa função irá processar os comandos em sequência mas que devem culminar com a geração de um gráfico como a função ‘plot’, ‘hist’ ou ‘ggplot’ e essa saída gráfica é direcionada para o componente da interface de nome correspondente. É óbvio que se dentro de renderPlot não houver um objeto gráfico como retorno de alguma função nada será plotado.

No caso o que temos é

Os comentários estão bem detalhados para ajudar a compreensão, mas quero enfatizar que temos uma chamada a função ‘hist’ que irá produzir o histograma e esse por sua vez exibido na ‘div’ da interface de nome ‘distPlot’.

Por fim a parte mais importante e mágica do Shiny que é a lógica reativa. Veja que não existem loops e ifs verificando o que o usuário faz na interface. O que temos é tratador de eventos ( event handler ) mascarado, ou embutido que detecta alterações no controle de nome “intervalos” via

De forma automática, toda e qualquer modificação na barra deslizante pelo usuário é detectada, o valor reavaliado e o método ‘renderPlot’ chamado para reconstruir o gráfico. É realmente mágico. 🙂  Principalmente se você programa nas camadas mais próximas da máquina e entende todas camadas de código que estão sendo ocultas nesse processo para que o usuário de R não tenha que se preocupar que esse lado da lógica. Infelizmente,  um problema gera outro. 🙂 temos que aprender a lógica do Shiny, mas acredite, é bem mais simples.

Um detalhe.

O data frame faithfull tem 2 colunas, ‘eruptions’ e ‘waiting’. A primeira a duração da erupção e a segunda o tempo de espera entre erupções.

O código final é esse aqui.

ui.R

server.R

 

 

 

 

 

 

 

 

 

Leave a Comment

Related Story
%d bloggers like this: