Atualização dos pacotes R e CRAN na nova versão Windows UTF-8!

Testaremos agora a nova atualização dos pacotes R e CRAN para a nova versão do Windows UTF-8, para facilitar o entendimento, criamos abaixo um tutorial passo a passo, que ficará mais simples de você entender, confira!

Atualização dos pacotes R e CRAN

R-devel-win.exe é um instalador experimental do R, configurado para baixar compilações binárias experimentais de pacotes CRAN. Ele define UTF-8 como a codificação padrão atual no Windows (versão do Windows 10 de novembro de 2019 ou mais recente). 92% dos pacotes CRAN são suportados. Pretende ser uma demonstração dessa opção para oferecer suporte a caracteres Unicode em R no Windows, não para uso em produção.

Para brincar com esta versão do R, inicie cmd.exe, execute chcp 65001 (para definir a página de código UTF-8), vá para Properties/Font/Font selecione NSimFun (uma fonte com glifos necessária para este exemplo), vá para C:\Program Files\R\R-devel\bin (diretório de instalação padrão da demonstração), execute R.

Verifique se a codificação da biblioteca C (codepage) e a codificação do sistema (system.codepage) são 65001, que é UTF-8.

> l10n_info()
$MBCS
[1] TRUE

$`UTF-8`
[1] TRUE

$`Latin-1`
[1] FALSE

$codepage
[1] 65001

$system.codepage
[1] 65001

Tente traçar um histograma com legendas em japonês (agora eu quero ver):

hist(mtcars[,"mpg"], xlab="マイル/ガロン", ylab="車の数")

Na versão padrão do R, isso funcionaria apenas no Windows em execução em uma localidade com suporte para japonês. Em outros sistemas Windows, não seria possível nem mesmo colar os caracteres japoneses (“Miles / Gallon” e “Number of Cars”) na janela RTerm. Com esta compilação de demonstração do R, ele deve funcionar em qualquer Windows 10 (versão de novembro de 2019 ou mais recente, testado pela última vez com a versão de abril de 2020).

Podemos fazer o mesmo com pacotes externos. Defina…

install.packages("ggplot2")

será instalado ggplot2 a partir do repositório binário de demonstração. Com ele, podemos definir:

library(ggplot2)
ggplot(mtcars,aes(x=mpg)) + geom_histogram(binwidth=5) + xlab('マイル/ガロン') + ylab('車の数')

Background

O Windows 10 (versão de novembro de 2019 e mais recente) permite que os aplicativos usem UTF-8 como sua codificação nativa ao fazer a interface com a biblioteca C (precisa ser UCRT) e com o sistema operacional.

Esta nova atualização dos pacotes R e CRAN do Windows, presente nos sistemas Unix há muitos anos, finalmente permite que o R no Windows funcione de forma confiável com todos os caracteres Unicode.

Os aplicativos que já funcionavam de maneira confiável com todos os caracteres Unicode no Windows antes usavam a API proprietária do Windows e cadeias de caracteres largos, o que exigia a implementação e manutenção de muitos códigos específicos do Windows.

Porém, R não seguiu esse caminho completamente, exceto para RGui e particularmente a interface de código específico do Windows: system/ operating system (em alguns casos no Windows isso também é necessário por outras razões que não a codificação de caracteres).

Hoje, o Windows não consegue nem codificar todos os caracteres Unicode usando um caractere largo (caracteres largos são de 16 bits, UTF16-LE é usado e, portanto, dois caracteres largos são necessários para representar alguns caracteres Unicode), portanto, a maneira antiga do Windows de oferecer suporte a Unicode não parece ter nenhuma vantagem técnica. A nova forma, via UTF-8, permitirá, em vez disso, eliminar gradualmente alguns códigos específicos do Windows de R.

Para usar UTF-8 como codificação nativa no Windows, apenas mudanças triviais em R são necessárias, mas precisamos reconstruir R e pacotes para usar UCRT como o tempo de execução C.

Para isso precisamos de um novo conjunto de ferramentas para Windows e precisamos reconstruir todo o código com o novo conjunto de ferramentas.

Não é mais possível reutilizar o código binário criado com conjuntos de ferramentas anteriores na forma de arquivos de objeto ou bibliotecas estáticas.

Infelizmente, uma prática comum ao construir pacotes R no Windows é baixar bibliotecas estáticas pré-construídas de fontes externas, que não funcionam mais quando essas são construídas com MSVCRT. Em princípio, essa é uma prática ruim no Windows, tal código deve ser compilado com a mesma cadeia de ferramentas do compilador.

A compatibilidade entre diferentes runtimes C, só pode ser presumida entre DLLs, e mesmo isso tem seus limites, como por exemplo, saber interpretar qual é a codificação nativa atual.

A Demo

Um novo conjunto de ferramentas do compilador experimental e várias bibliotecas para R e pacotes foram construídos usando GCC 9 e MXE (compilação cruzada no Linux).

Esta parte do trabalho exigiu a atualização de algumas configurações de compilação MXE para usar um software mais recente, para compilar com UCRT, para compilar com GCC mais recente, etc. Também foi necessário corrigir algum software externo para compilar ou construir com MXE (que é um ambiente de compilação cruzada).

Várias outras bibliotecas externas seriam necessárias para suportar todos os pacotes CRAN. Ufa… Demorou cerca de 5 dias para terminar isto ao nível que R com pacotes básicos e recomendados pudessem ser construídos, cerca de mais cerca de 5 dias para adicionar mais bibliotecas de modo que esses 92% dos pacotes CRAN sejam suportados (nota: muitos pacotes CRAN não tem qualquer código nativo).

R foi corrigido para permitir UTF-8 como codificação nativa no Windows, o que é trivial (compatível com outros sistemas operacionais) e já faz parte do R-devel. A compilação de demonstração é então corrigida para definir UTF-8 por meio do manifesto de fusão (deve ser feito para um executável no momento da compilação), para compilar apenas o 64-bit binaries/installer, mais algumas pequenas alterações.

Mais de 50 pacotes CRAN foram corrigidos para compilar com o novo conjunto de ferramentas. Quase todos os pacotes apenas removiam o download do código binário externo no momento da instalação e o substituíam ligando-se a bibliotecas estáticas construídas junto com o conjunto de ferramentas experimental.

Observe que muitos pacotes estão baixando códigos que estão disponíveis até mesmo no RTools4. Além disso, alguns pacotes estão baixando o código-fonte de software externo e compilando-o, embora ele esteja incluído até mesmo no RTools4.

A correção dos pacotes para construir e construir versões binárias de todos os pacotes levou cerca de 5 dias. Os pacotes restantes precisam de mais algumas bibliotecas na cadeia de ferramentas. Além disso, os pacotes foram testados via R CMD check.

Fora dos pacotes CRAN e BIOC necessários (15793), cerca de 92% foram construídos e passaram nos testes com OK/NOTE (14656 pacotes CRAN e 59 BIOC). Todos os pacotes binários criados estão disponíveis para uso, mesmo aqueles que falharam em seus testes.

Testando

Caso alguém encontre um problema relacionado à codificação nesta compilação, algo que deveria estar funcionando com UTF-8 como codificação nativa, mas não está, se desejar me enviar um relatório, será muito bem-vindo.

Atualização dos pacotes R e CRAN - Testando

É impossível que algumas partes de R tenham enterrado suposições de que a codificação nativa no Windows nunca é multibyte (que é de byte único ou duplo), e esses casos teriam que ser corrigidos. É improvável que tais problemas tenham sido encontrados executando R CMD check, pois os testes / exemplos não incluem caracteres incomuns.

Conclusão

Com base também nesta experiência, acredito que a mudança para UCRT já seja possível e espero que a construção de uma cadeia de ferramentas completa leve alguns meses. Acho que é a única maneira realista de oferecer suporte a caracteres Unicode (não representáveis ​​na codificação nativa) de forma confiável em R no Windows.

Investir mais esforços para adicionar e corrigir vários “atalhos” (evitando conversões para codificação nativa em alguns casos) apenas complica o código, introduz mais bugs e não pode resolver o problema completamente.

Durante a pesquisa para este tutorial, consegui conversar em um forum com um dos cientistas de programação da Microsoft, e perguntei porque a atualização dos pacotes R e CRAN não poderiam ser feitas pelo próprio sistema, ele me disse que reescrever todos os pacotes R e R para usar a antiga maneira proprietária do Windows para oferecer suporte a Unicode (caracteres largos, API do Windows proprietária em vez da biblioteca C padrão) está fora de questão, acredito que exigiria muito mais esforço e quase ninguém quero fazer isso.

Isso exigiria especialistas em R internos (por exemplo, reescrever o analisador ou o código de conexões) e duplicaria muito código ou causaria ineficiências nos sistemas Unix, nenhum dos quais parece aceitável. Algumas bibliotecas externas usadas provavelmente teriam que ser substituídas ou ampliadas.

Construir um novo conjunto de ferramentas e bibliotecas UCRT não requer nenhum conhecimento especial de R nem de seus componentes internos.

Pacotes para software externo para construir com UCRT (por exemplo, quando contribuídos de volta para MXE ou sistemas semelhantes) poderiam ser reutilizados por outros projetos, completamente não relacionados a R.

Finalmente, acredito que mudar de MSVCRT para UCRT provavelmente será necessário em algum momento.

Compartilhe

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp
Share on print
imprimir
Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on print

O que achou deste artigo?

Leia também