Capítulo 5. Gerar código R a partir de configurações da GUI

Usar JavaScript em plugins do RKWard

Agora temos uma GUI definida, mas ainda precisamos gerar algum código R a partir dela. Para isso, precisamos de outro arquivo de texto, code.js, localizado no mesmo diretório que o arquivo description.xml. Você pode ou não estar familiarizado com o JavaScript (ou, para ser tecnicamente preciso: ECMA-script). A documentação sobre JS pode ser encontrada em abundância, tanto impressa quanto na internet (por exemplo: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide). Mas, para a maioria dos propósitos, você não precisará saber muito sobre JS, pois usaremos apenas alguns recursos básicos.

Dica

Após ler este capítulo, dê uma olhada também no pacote rkwarddev. Ele fornece algumas funções em R para criar código JavaScript comumente usado no RKWard. Ele também pode detectar automaticamente variáveis ​​usadas em um arquivo XML de plugin e criar código JavaScript básico a partir disso para você começar.

Nota

Os arquivos de plugin .js são considerados codificados em UTF-8. Verifique a codificação do seu editor caso esteja usando caracteres não-ASCII.

Para o teste t de duas variáveis, o arquivo code.js tem a seguinte aparência (com comentários entre as linhas):

preprocess()

function preprocess () {
}
                

O arquivo JS está organizado em três funções separadas: preprocess(), calculate() e printout(). Isso ocorre porque nem todo o código é necessário em todos os estágios. Atualmente, a função preprocess não é realmente usada em muitos lugares (normalmente você a omitirá completamente).

calculate()

function calculate () {
        echo ('res <- t.test (x=' + getString ("x") + ', y=' + getString ("y") + ', hypothesis="' + getString ("hypothesis") + '"' + getString ("varequal"));
        var conflevel = getString ("conflevel");
        if (conflevel != "0.95") echo (', conf.level=' + conflevel);
        echo (')\n');
}
                

Esta função gera a sintaxe real do R a ser executada a partir das configurações da GUI. Vamos analisar isso em detalhes: O código a ser usado é gerado usando a instrução echo(). Analisando a instrução echo() passo a passo, a primeira parte dela é

res <- t.test (
                

como texto simples. Em seguida, precisamos preencher o valor que o usuário selecionou como a primeira variável. Buscamos isso usando getString ("x"), e o anexamos à string a ser exibida. Isso imprime o valor do elemento GUI com id="x": nosso primeiro <checkbox>. Em seguida, acrescentamos um ', ' e fazemos o mesmo para buscar o valor do elemento "y" - o segundo <checkbox>. Para a hipótese (o grupo <radio>), e a <checkbox> das variâncias iguais, o procedimento é muito semelhante.

Nota

Em vez de concatenar strings usando o operador +, você também pode usar um "template literal", como este (observe que a string está entre crases (`)):

echo(`res <- t.test (x=${ getString("x") }, y=${ getString("y") }, hypothesis="${ getString("hypothesis") }"`); // etc.
                        

Observe que, em vez de concatenar os trechos de saída com +, você também pode usar várias instruções echo(). Tudo é impresso em uma única linha. Para inserir uma quebra de linha no código gerado, insira um "\n" na string exibida. Em teoria, você pode até mesmo gerar várias linhas com uma única instrução echo, mas, por favor, limite-se a uma linha (ou menos) de código gerado por cada echo().

Nota

Além de getString(), também existem as funções getBoolean(), que tentará retornar o valor como um booleano lógico (adequado para uso em uma instrução if()), e getList(), que tentará retornar dados em formato de lista em um Array() do JavaScript. Mostraremos exemplos dessas funções mais adiante.

Ao analisar os plugins existentes, você também encontrará muitos plugins usando getValue(), em vez de getString(), e na verdade os dois são quase idênticos. No entanto, usar getString(), getBoolean() e getList() é a prática recomendada desde a versão 0.6.1.

A situação fica um pouco mais complexa para o nível de confiança. Por razões estéticas, não queremos especificar explicitamente o nível de confiança a ser usado, caso ele corresponda ao valor padrão. Portanto, em vez de imprimir o valor incondicionalmente, primeiro o armazenamos em uma variável. Em seguida, verificamos se essa variável difere de 0,95 e, em caso afirmativo, imprimimos um argumento adicional. Finalmente, exibimos um colchete de fechamento e uma quebra de linha: ") ". Isso é tudo para a função de cálculo.

printout()

function printout () {
        echo ('rk.header (' + i18n ("Teste t com duas variáveis") + ')\n');
        echo ('rk.print (res)\n');
}
                

E isso era tudo o que havia na função printout na maioria dos casos. rk.header() imprime um cabeçalho padrão para os resultados. Observe que nos arquivos .js, você precisa marcar todas as strings traduzíveis manualmente, usando i18n() ou alguns comandos alternativos. Mais sobre isso no capítulo sobre internacionalização. Você também pode adicionar mais informações a isso, se desejar, por exemplo:

function printout () {
        new Header (i18n ("Teste t com duas variáveis"))
                  .addFromUI ("varequal")
                  .add (i18n ("Nível de confiança"), getString ("conflevel"))  // Nota: escrito assim para fins ilustrativos. Mais automático:
        //        .addFromUI ("conflevel")
                  .print ();
echo ('rk.print (res)\n');
}
                

rk.print() utiliza o pacote R2HTML para fornecer saída formatada em HTML. Outra função útil é rk.results(), que também pode gerar diferentes tipos de tabelas de resultados. Em caso de dúvida, use rk.print() e pronto. A classe JS Header é uma função auxiliar em nível de JS para gerar uma chamada para rk.header() (basta dar uma olhada no código gerado). Em alguns casos, você pode querer chamar echo ('rk.header(...)') diretamente para imprimir um cabeçalho para sua saída.

Observe que, internamente, a saída é apenas um documento HTML simples neste momento. Portanto, você pode ser tentado a adicionar HTML personalizado usando rk.cat.output(). Embora isso funcione, por favor, não faça isso. O formato de saída pode mudar (por exemplo, para ODF) no futuro, então é melhor não introduzir código específico de HTML. Em vez disso, mantenha as coisas simples com rk.header(), rk.print(), rk.results() e -- se necessário -- rk.print.literal(). Se esses não atenderem às suas necessidades de formatação, entre em contato conosco na lista de discussão para obter ajuda.

Parabéns! Você criou seu primeiro plugin. Continue lendo nos próximos capítulos para conhecer conceitos mais avançados.