Recursos de um aplicativo corporativo R robusto

Quem trabalha com R sabe bem que o idioma foi originalmente projetado como uma ferramenta para o trabalho interativo. Naturalmente, os métodos convenientes para o aplicativo passo a passo baseado em console por uma pessoa que está profundamente envolvida no assunto são inadequados para criar um aplicativo para o usuário final. A capacidade de obter diagnósticos detalhados imediatamente após o fato de um erro, de examinar todas as variáveis ​​e rastreamentos, de executar manualmente os elementos de código (possivelmente alterando parcialmente as variáveis) - tudo isso ficará indisponível quando o aplicativo R estiver offline em um ambiente corporativo. (dizemos R, queremos dizer basicamente aplicativos da Web brilhantes).


No entanto, nem tudo é tão ruim. O ambiente R (pacotes e abordagens) evoluiu tanto que vários truques muito simples podem resolver com elegância o problema de garantir a estabilidade e a confiabilidade dos aplicativos do usuário. Um número deles será descrito abaixo.


É uma continuação de publicações anteriores .


Qual é a dificuldade da tarefa?


O principal conjunto de tarefas para as quais o R é frequentemente usado é o processamento diversificado de dados. E mesmo um algoritmo totalmente depurado, organizado de todos os lados por testes e totalmente documentado, pode facilmente quebrar e dar bobagens se dados curvados forem inseridos em sua entrada.


Os dados podem ser inseridos de outros sistemas de informação e de usuários. E, se no primeiro caso, é possível exigir a conformidade com a API e impor restrições muito rígidas à estabilidade do fluxo de informações, no segundo caso não há como escapar de surpresas. Uma pessoa pode cometer um erro e colocar o arquivo errado, escrever errado. 99% dos usuários usam o Excel em seu trabalho e preferem excluir o sistema, muitas páginas, com formatação esperta. Nesse caso, a tarefa se torna ainda mais complicada. Mesmo um documento visualmente válido pode parecer completamente sem sentido do ponto de vista da máquina. As datas estão espalhadas (a história muito famosa "o designer do Excel pensou que 1900 era um ano bissexto, mas não era" ). Os valores numéricos são armazenados como texto e digitados. Células invisíveis e fórmulas ocultas ... E muito mais. Em princípio, é impossível prever todos os ancinhos possíveis - não há imaginação suficiente. Vale a pena apenas dobrar registros em várias junções com fontes curvas.


Como uma consideração adicional, tomaremos o seguinte:


  1. O excelente documento “Uma introdução à limpeza de dados com R” descreve o processo de preparação preliminar de dados. Para etapas adicionais, destacamos a presença de duas fases de validação: técnica e lógica.


    • A validação técnica é verificar a correção da fonte de dados. Estrutura, tipos, indicadores quantitativos.
    • A validação lógica pode ser de vários estágios, realizada durante os cálculos, e consiste em verificar a conformidade de certos elementos de dados ou suas combinações com vários requisitos lógicos.

  2. Uma das regras básicas no desenvolvimento de interfaces com o usuário é a formação dos diagnósticos mais completos em caso de erros do usuário. Ou seja, se o usuário fez o upload do arquivo, é necessário verificar sua correção o máximo possível e fornecer um resumo completo de todos os erros (também é aconselhável explicar o que está errado), e não colidir com o primeiro problema com uma mensagem como “Entrada incorreta valor @ line 528493, pos 17 ”e requer o download de um novo arquivo com este erro corrigido. Essa abordagem permite reduzir significativamente o número de iterações para formar a fonte correta e melhorar a qualidade do resultado final.

Tecnologias e métodos de validação


Vamos do fim. Há vários pacotes para validação lógica. Em nossa prática, decidimos pelas seguintes abordagens.


  1. Já é um dplyr clássico. Em casos simples, é conveniente simplesmente desenhar um tubo com uma série de verificações e análises do resultado final.
  2. O pacote de validate para verificar objetos tecnicamente corretos quanto à conformidade com as regras fornecidas.

Para validação técnica, focamos nas seguintes abordagens:


  1. Pacote checkmate com uma ampla gama de funções rápidas para realizar uma variedade de verificações técnicas.
  2. Trabalho explícito com as exceções "R. avançado, depuração, tratamento de condições e programação defensiva" , "R. avançado, além do tratamento de exceções: condições e reinicializações", para conduzir a validação completa em uma única etapa e garantir a estabilidade do aplicativo.
  3. Use invólucros de purr para exceções. Muito útil quando usado dentro de um tubo.

No código dividido em funções, um elemento importante da programação defensiva é verificar os parâmetros de entrada e saída das funções. No caso de idiomas com digitação dinâmica, a verificação de tipo deve ser feita independentemente. Para tipos básicos, o pacote checkmate é ideal, especialmente suas qassert \ qassert . Para verificar o data.frame paramos na seguinte construção (verificando nomes e tipos). O truque para mesclar o nome e o tipo reduz o número de linhas na verificação.


 ff <- function(dataframe1, dataframe2){ #        calledFun <- deparse(as.list(sys.call())[[1]]) tic("Calculating XYZ") #       (class,   typeof,  Date ) list(dataframe1=c("name :: character", "val :: numeric", "ship_date :: Date"), dataframe2=c("out :: character", "label :: character")) %>% purrr::iwalk(~{ flog.info(glue::glue("Function {calledFun}: checking '{.y}' parameter with expected structure '{collapse(.x, sep=', ')}'")) rlang::eval_bare(rlang::sym(.y)) %>% assertDataFrame(min.rows=1, min.cols=length(.x)) %>% {assertSetEqual(.x, stri_join(names(.), map_chr(., class), sep=" :: "), .var.name=.y)} # {assertSubset(.x, stri_join(names(.), map_chr(., typeof), sep=" :: "))} }) … } 

Como parte da função de verificação de tipo, você pode escolher um método ao seu gosto, de acordo com os dados esperados. class foi escolhida porque é a que dá a data como Date , e não como um número (representação interna). A questão da determinação de tipos de dados é discutida em grande detalhe no diálogo "Uma pesquisa abrangente dos tipos de coisas em R. 'mode' e 'class' e 'typeof' são insuficientes" .


assertSetEqual ou assertSubset são selecionados por razões de limpar colunas correspondentes ou pelo mínimo suficiente.


Para tarefas práticas, um conjunto tão pequeno cobre completamente a maioria das necessidades.


Post anterior - R como uma bóia de vida para um administrador de sistemas .

Source: https://habr.com/ru/post/pt413865/


All Articles