Existem muitas maneiras de escrever código R para uma determinada tarefa, e existem ainda mais maneiras de gerar esse código R a partir de JS. Como exatamente você fará isso, fica a seu critério. Ainda assim, existem algumas considerações que você deve seguir e informações básicas que você deve compreender.
Na maioria das vezes, você precisará criar um ou mais objetos R temporários no código gerado pelo seu plugin. Normalmente, você não quer que eles sejam colocados no espaço de trabalho do usuário, podendo até mesmo sobrescrever variáveis do usuário. Portanto, todo o código gerado pelo plugin é executado em um ambiente local() (consulte a página de ajuda do R sobre a função local()). Isso significa que todas as variáveis que você criar serão temporárias e não serão salvas permanentemente.
Se o usuário solicitar explicitamente que uma variável seja salva, você precisará atribuir a esse objeto usando .GlobalEnv$objectname <- valor. Em geral, não use o operador <<-. Ele não atribuirá necessariamente um valor em .GlobalEnv.
Uma armadilha importante é usar eval(). Aqui, você precisa observar que, por padrão, `eval` usará o ambiente atual para avaliação, isto é, o ambiente local. Isso funcionará bem na maioria das vezes, mas nem sempre. Portanto, se você precisar usar eval(), provavelmente desejará especificar o parâmetro envir: eval(..., envir=globalenv()).
O mais importante é que o seu código R gerado funcione, mas ele também deve ser fácil de ler. Portanto, preste atenção também à formatação. Algumas considerações:
As instruções R de nível superior normais devem ser alinhadas à esquerda.
As declarações em um bloco inferior devem ser recuadas com uma tabulação (veja o exemplo abaixo).
Se você fizer cálculos muito complexos, adicione comentários aqui e ali, especialmente para marcar seções lógicas. Observe que existe uma função dedicada comment() para inserir comentários traduzíveis no código gerado.
Por exemplo, o código gerado pode ter esta aparência. O mesmo código sem indentação ou comentários seria bastante difícil de ler, apesar de sua modesta complexidade:
# primeiro determine a oscilação e a rotação
my.wobble <- wobble (x, y)
my.rotation <- wobble.rotation (my.wobble, z)
# o método de seleção deve ser escolhido de acordo com a rotação
if (my.rotation > wobble.rotation.limit (x)) {
method <- "foo"
result <- boggle.foo (my.wobble, my.rotation)
} else {
method <- "bar"
result <- boggle.bar (my.wobble, my.rotation)
}
Muitos plugins podem fazer mais de uma coisa. Por exemplo, o plugin “Estatísticas Descritivas” pode calcular média, amplitude, soma, produto, mediana, comprimento, etc. No entanto, normalmente o usuário escolherá apenas realizar alguns desses cálculos. Nesse caso, tente manter o código gerado o mais simples possível. Ele deve conter apenas partes relevantes para as opções que foram selecionadas. Para conseguir isso, aqui está um exemplo de um padrão de design comum de como você o usaria (em JS; aqui, "domean", "domedian" e "dosd" seriam elementos <checkbox>):
function calculate () {
echo ('x <- <' + getString ("x") + ')\n');
echo ('results <- list ()\n');
if (getBoolean ("domean.state")) echo ("results$" + i18n ("Valor médio") + " <- mean (x)\n");
if (getBoolean ("domedian.state")) echo ("results$" + i18n ("Mediana") + " <- median (x)\n");
if (getBoolean ("dosd.state")) echo ("results$" + i18n ("Desvio padrão") + " <- sd (x)\n");
//...
}