Compatibilidade com pacotes

Até agora aprendemos como reduzir os erros comuns de reprodutibilidade computacional associados a arquivos presentes no nosso diretório. Porém, na maioria dos projetos não utilizamos apenas arquivos que estão presentes no diretório local ou remoto, por exemplo, os pacotes!

Os pacotes são disponibilizados abertamente e o que fazemos é baixar uma versão deste pacote em nosso computador. Porém, pacotes nem sempre (ou a maioria das vezes), ficam da maneira como os baixamos. Pacotes são editados por seus proponentes, função internas são corrigidas, algumas são excluídas, outras adicionadas e algumas vezes até mesmo o nome da função é modificado. Mas como conseguimos garantir que nosso código seja reprodutível, quando ele depende de uma outra pessoa atualizando funções e dependências nos nossos scripts? Uma das soluções é o pacote {renv}

Garantindo a reprodutibilidade das funções: {renv}

O pacote Renv é um pacote para criar ambientes reprodutíveis em seus projetos de análise no R. A ideia do Renv é criar uma biblioteca para salvar os pacotes e as versões usadas no seu seu workflow de trabalho, de forma que quando você ou alguém baixa seu repositório inteiro, a biblioteca vem junto com todos os pacotes. Assim, cada projeto terá sua própria biblioteca!!!

Geralmente a biliboteca do R (um diretório contendo os pacotes instalados com install.packages()), é única e guardada em alguma pasta no seu computador.

Para saber onde está sua biblioteca, dê o comando:

.libPaths()

Ao iniciar o Renv no repositório do seu projeto, você verá a adição de uma pasta renv/library onde serão guardados os pacotes usados.

Esquema de funcionamento do Renv retirado da vinheta do pacote.

A grande sacada do {renv} para garantir a reprodutibilidade das funções dos pacotes utilizados é que ele instala estas dependências numa pasta específica do projeto que contém tais dependência. Desta forma, ao utilizar um projeto de outra pessoa, ou o seu próprio projeto no futuro, você irá utilizar as mesmas versões dos pacotes.

{renv} na prática

Quatro funções são essenciais para utilizar o pacote {renv}. Lembre-se sempre faça isso dentro de um projeto

  1. renv::init() primeira ação a ser realizada para iniciar o uso do pacote no seu projeto.

  2. renv::status() confere o status das dependências contidas no seu projeto

  3. renv::snapshot() utilize essa função toda vez que instalar um pacote novo, isso garantirá que a versão deste pacote estará registrada nos arquivos especiais criados pelo {renv}

  4. renv::restore() esta função é utilizada quando você quiser reproduzir algum projeto. Por exemplo, ao baixar um projeto do GitHub abra a imagem do Rproject e utilize a função restore() isso irá desencadear a instalação das versões dos pacotes utilizadas no projeto em seu computador, garantindo assim a reprodutibilidade

Garantindo a reprodutibilidade das funções: {groundhog}

Outra opção é o ótimo pacote {groundhog}, que exerce funções similares ao renv mas, tecnicamente, de maneiras distintas. O objetivo final é o mesmo, aumentar a chance de reprodutibilidade de códigos em R ao resolver a compatibilidade de versões de pacotes estatísticos utilizados nestes scripts.

A grande diferença entre o pacote {renv} e o {groundhog} é o fato de que o segundo funciona isoladamente em scripts, enquanto o primeir, necessariamente, faz uso dos projetos no R.

{groundhog} na prática

Para utilizar o {groundhog} devemos chamar as dependências (pacotes) utilizando uma função do groundhog da seguinte maneira

library(groundhog)
groundhog.day="2020-11-01"
pkgs=c('pwr','metafor','data.tables')
groundhog.library(pkgs, groundhog.day)

Ou seja, utilizamos dois argumentos na função groundhog.library um indicando os pacotes que devem ser carregados e um segundo, aí a grande diferença do groundhog, indicando uma data de uso do pacote. Esta data funcionará para baixar a versão do pacote mais recente tendo como referência a data indicada.

Exercício

Tente as duas formas de ler pacotes apresentadas nesta seção, veja o que mudou (ou não) no seu diretório.

Leituras adicionais

Para mais informações sobre o pacote {renv} veja este material. Para mais informações sobre o {groundhog} veja o blog escrito por um dos desenvolvedores do pacote. A propósito, o blog Data Colada é uma fonte sensacional de ideias e discussões sobre ciência, reprodutibilidade e tudo o mais.

LS0tDQp0aXRsZTogIkFtYmllbnRlIHJlcHJvZHV0w612ZWwgY29tICdSZW52JyINCmF1dGhvcjogIk1lbGluYSBMZWl0ZSBlIEdhYnJpZWwgTmFrYW11cmEiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQojIENvbXBhdGliaWxpZGFkZSBjb20gcGFjb3Rlcw0KDQpBdMOpIGFnb3JhIGFwcmVuZGVtb3MgY29tbyByZWR1emlyIG9zIGVycm9zIGNvbXVucyBkZSByZXByb2R1dGliaWxpZGFkZSBjb21wdXRhY2lvbmFsIGFzc29jaWFkb3MgYSBhcnF1aXZvcyBwcmVzZW50ZXMgbm8gbm9zc28gZGlyZXTDs3Jpby4gUG9yw6ltLCBuYSBtYWlvcmlhIGRvcyBwcm9qZXRvcyBuw6NvIHV0aWxpemFtb3MgYXBlbmFzIGFycXVpdm9zIHF1ZSBlc3TDo28gcHJlc2VudGVzIG5vIGRpcmV0w7NyaW8gbG9jYWwgb3UgcmVtb3RvLCBwb3IgZXhlbXBsbywgb3MgcGFjb3RlcyENCg0KT3MgcGFjb3RlcyBzw6NvIGRpc3BvbmliaWxpemFkb3MgYWJlcnRhbWVudGUgZSBvIHF1ZSBmYXplbW9zIMOpIGJhaXhhciB1bWEgdmVyc8OjbyBkZXN0ZSBwYWNvdGUgZW0gbm9zc28gY29tcHV0YWRvci4gUG9yw6ltLCBwYWNvdGVzIG5lbSBzZW1wcmUgKG91IGEgbWFpb3JpYSBkYXMgdmV6ZXMpLCBmaWNhbSBkYSBtYW5laXJhIGNvbW8gb3MgYmFpeGFtb3MuIFBhY290ZXMgc8OjbyBlZGl0YWRvcyBwb3Igc2V1cyBwcm9wb25lbnRlcywgZnVuw6fDo28gaW50ZXJuYXMgc8OjbyBjb3JyaWdpZGFzLCBhbGd1bWFzIHPDo28gZXhjbHXDrWRhcywgb3V0cmFzIGFkaWNpb25hZGFzIGUgYWxndW1hcyB2ZXplcyBhdMOpIG1lc21vIG8gbm9tZSBkYSBmdW7Dp8OjbyDDqSBtb2RpZmljYWRvLiBNYXMgY29tbyBjb25zZWd1aW1vcyBnYXJhbnRpciBxdWUgbm9zc28gY8OzZGlnbyBzZWphIHJlcHJvZHV0w612ZWwsIHF1YW5kbyBlbGUgZGVwZW5kZSBkZSB1bWEgb3V0cmEgcGVzc29hIGF0dWFsaXphbmRvIGZ1bsOnw7VlcyBlIGRlcGVuZMOqbmNpYXMgbm9zIG5vc3NvcyBzY3JpcHRzPyBVbWEgZGFzIHNvbHXDp8O1ZXMgw6kgbyBwYWNvdGUge2ByZW52YH0NCg0KIyBHYXJhbnRpbmRvIGEgcmVwcm9kdXRpYmlsaWRhZGUgZGFzIGZ1bsOnw7Vlczoge2ByZW52YH0NCg0KTyBwYWNvdGUgYFJlbnZgIMOpIHVtIHBhY290ZSBwYXJhIGNyaWFyIGFtYmllbnRlcyByZXByb2R1dMOtdmVpcyBlbSBzZXVzIHByb2pldG9zIGRlIGFuw6FsaXNlIG5vIFIuIEEgaWRlaWEgZG8gYFJlbnZgIMOpIGNyaWFyIHVtYSBiaWJsaW90ZWNhIHBhcmEgc2FsdmFyIG9zIHBhY290ZXMgZSBhcyB2ZXJzw7VlcyB1c2FkYXMgbm8gc2V1IHNldSB3b3JrZmxvdyBkZSB0cmFiYWxobywgZGUgZm9ybWEgcXVlIHF1YW5kbyB2b2PDqiBvdSBhbGd1w6ltIGJhaXhhIHNldSByZXBvc2l0w7NyaW8gaW50ZWlybywgYSBiaWJsaW90ZWNhIHZlbSBqdW50byBjb20gdG9kb3Mgb3MgcGFjb3Rlcy4gQXNzaW0sIGNhZGEgcHJvamV0byB0ZXLDoSBzdWEgcHLDs3ByaWEgYmlibGlvdGVjYSEhIQ0KDQpHZXJhbG1lbnRlIGEgYmlsaWJvdGVjYSBkbyBSICh1bSBkaXJldMOzcmlvIGNvbnRlbmRvIG9zIHBhY290ZXMgaW5zdGFsYWRvcyBjb20gYGluc3RhbGwucGFja2FnZXMoKWApLCDDqSDDum5pY2EgZSBndWFyZGFkYSBlbSBhbGd1bWEgcGFzdGEgbm8gc2V1IGNvbXB1dGFkb3IuDQoNClBhcmEgc2FiZXIgb25kZSBlc3TDoSBzdWEgYmlibGlvdGVjYSwgZMOqIG8gY29tYW5kbzoNCg0KYGBge3IsIGV2YWw9Rn0NCi5saWJQYXRocygpDQpgYGANCg0KQW8gaW5pY2lhciBvIGBSZW52YCBubyByZXBvc2l0w7NyaW8gZG8gc2V1IHByb2pldG8sIHZvY8OqIHZlcsOhIGEgYWRpw6fDo28gZGUgdW1hIHBhc3RhIGByZW52L2xpYnJhcnlgIG9uZGUgc2Vyw6NvIGd1YXJkYWRvcyBvcyBwYWNvdGVzIHVzYWRvcy4NCg0KWyFbRXNxdWVtYSBkZSBmdW5jaW9uYW1lbnRvIGRvIFJlbnYgcmV0aXJhZG8gZGEgdmluaGV0YSBkbyBwYWNvdGUuXShmaWdzL3JlbnZfc2NoZW1lLnBuZyldKGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vcmVudi9hcnRpY2xlcy9yZW52Lmh0bWwpDQoNCkEgZ3JhbmRlIHNhY2FkYSBkbyB7YHJlbnZgfSBwYXJhIGdhcmFudGlyIGEgcmVwcm9kdXRpYmlsaWRhZGUgZGFzIGZ1bsOnw7VlcyBkb3MgcGFjb3RlcyB1dGlsaXphZG9zIMOpIHF1ZSBlbGUgaW5zdGFsYSBlc3RhcyBkZXBlbmTDqm5jaWFzIG51bWEgcGFzdGEgZXNwZWPDrWZpY2EgZG8gcHJvamV0byBxdWUgY29udMOpbSB0YWlzIGRlcGVuZMOqbmNpYS4gRGVzdGEgZm9ybWEsIGFvIHV0aWxpemFyIHVtIHByb2pldG8gZGUgb3V0cmEgcGVzc29hLCBvdSBvIHNldSBwcsOzcHJpbyBwcm9qZXRvIG5vIGZ1dHVybywgdm9jw6ogaXLDoSB1dGlsaXphciBhcyBtZXNtYXMgdmVyc8O1ZXMgZG9zIHBhY290ZXMuDQoNCiMjIHtgcmVudmB9IG5hIHByw6F0aWNhDQoNClF1YXRybyBmdW7Dp8O1ZXMgc8OjbyBlc3NlbmNpYWlzIHBhcmEgdXRpbGl6YXIgbyBwYWNvdGUge2ByZW52YH0uIExlbWJyZS1zZSAqKnNlbXByZSBmYcOnYSBpc3NvIGRlbnRybyBkZSB1bSBwcm9qZXRvKioNCg0KMS4gYHJlbnY6OmluaXQoKWAgcHJpbWVpcmEgYcOnw6NvIGEgc2VyIHJlYWxpemFkYSBwYXJhIGluaWNpYXIgbyB1c28gZG8gcGFjb3RlIG5vIHNldSBwcm9qZXRvLiANCg0KMi4gYHJlbnY6OnN0YXR1cygpYCBjb25mZXJlIG8gc3RhdHVzIGRhcyBkZXBlbmTDqm5jaWFzIGNvbnRpZGFzIG5vIHNldSBwcm9qZXRvDQoNCjMuIGByZW52OjpzbmFwc2hvdCgpYCB1dGlsaXplIGVzc2EgZnVuw6fDo28gdG9kYSB2ZXogcXVlIGluc3RhbGFyIHVtIHBhY290ZSBub3ZvLCBpc3NvIGdhcmFudGlyw6EgcXVlIGEgdmVyc8OjbyBkZXN0ZSBwYWNvdGUgZXN0YXLDoSByZWdpc3RyYWRhIG5vcyBhcnF1aXZvcyBlc3BlY2lhaXMgY3JpYWRvcyBwZWxvIHtgcmVudmB9DQoNCjQuIGByZW52OjpyZXN0b3JlKClgIGVzdGEgZnVuw6fDo28gw6kgdXRpbGl6YWRhIHF1YW5kbyB2b2PDqiBxdWlzZXIgcmVwcm9kdXppciBhbGd1bSBwcm9qZXRvLiBQb3IgZXhlbXBsbywgYW8gYmFpeGFyIHVtIHByb2pldG8gZG8gR2l0SHViIGFicmEgYSBpbWFnZW0gZG8gUnByb2plY3QgZSB1dGlsaXplIGEgZnVuw6fDo28gYHJlc3RvcmUoKWAgaXNzbyBpcsOhIGRlc2VuY2FkZWFyIGEgaW5zdGFsYcOnw6NvIGRhcyB2ZXJzw7VlcyBkb3MgcGFjb3RlcyB1dGlsaXphZGFzIG5vIHByb2pldG8gZW0gc2V1IGNvbXB1dGFkb3IsIGdhcmFudGluZG8gYXNzaW0gYSByZXByb2R1dGliaWxpZGFkZQ0KDQoNCiMgR2FyYW50aW5kbyBhIHJlcHJvZHV0aWJpbGlkYWRlIGRhcyBmdW7Dp8O1ZXM6IHtgZ3JvdW5kaG9nYH0NCg0KT3V0cmEgb3DDp8OjbyDDqSBvIMOzdGltbyBwYWNvdGUge2Bncm91bmRob2dgfSwgcXVlIGV4ZXJjZSBmdW7Dp8O1ZXMgc2ltaWxhcmVzIGFvIGByZW52YCBtYXMsIHRlY25pY2FtZW50ZSwgZGUgbWFuZWlyYXMgZGlzdGludGFzLiBPIG9iamV0aXZvIGZpbmFsIMOpIG8gbWVzbW8sIGF1bWVudGFyIGEgY2hhbmNlIGRlIHJlcHJvZHV0aWJpbGlkYWRlIGRlIGPDs2RpZ29zIGVtIFIgYW8gcmVzb2x2ZXIgYSBjb21wYXRpYmlsaWRhZGUgZGUgdmVyc8O1ZXMgZGUgcGFjb3RlcyBlc3RhdMOtc3RpY29zIHV0aWxpemFkb3MgbmVzdGVzIHNjcmlwdHMuDQoNCkEgZ3JhbmRlIGRpZmVyZW7Dp2EgZW50cmUgbyBwYWNvdGUge2ByZW52YH0gZSBvIHtgZ3JvdW5kaG9nYH0gw6kgbyBmYXRvIGRlIHF1ZSBvIHNlZ3VuZG8gZnVuY2lvbmEgaXNvbGFkYW1lbnRlIGVtIHNjcmlwdHMsIGVucXVhbnRvIG8gcHJpbWVpciwgbmVjZXNzYXJpYW1lbnRlLCBmYXogdXNvIGRvcyBwcm9qZXRvcyBubyBSLg0KDQojIyB7YGdyb3VuZGhvZ2B9IG5hIHByw6F0aWNhDQoNClBhcmEgdXRpbGl6YXIgbyB7YGdyb3VuZGhvZ2B9IGRldmVtb3MgY2hhbWFyIGFzIGRlcGVuZMOqbmNpYXMgKHBhY290ZXMpIHV0aWxpemFuZG8gdW1hIGZ1bsOnw6NvIGRvIGdyb3VuZGhvZyBkYSBzZWd1aW50ZSBtYW5laXJhDQoNCmBgYHtyIGVjaG89VFJVRSwgZXZhbD1GQUxTRX0NCmxpYnJhcnkoZ3JvdW5kaG9nKQ0KZ3JvdW5kaG9nLmRheT0iMjAyMC0xMS0wMSINCnBrZ3M9YygncHdyJywnbWV0YWZvcicsJ2RhdGEudGFibGVzJykNCmdyb3VuZGhvZy5saWJyYXJ5KHBrZ3MsIGdyb3VuZGhvZy5kYXkpDQpgYGANCg0KT3Ugc2VqYSwgdXRpbGl6YW1vcyBkb2lzIGFyZ3VtZW50b3MgbmEgZnVuw6fDo28gYGdyb3VuZGhvZy5saWJyYXJ5YCB1bSBpbmRpY2FuZG8gb3MgcGFjb3RlcyBxdWUgZGV2ZW0gc2VyIGNhcnJlZ2Fkb3MgZSB1bSBzZWd1bmRvLCBhw60gYSBncmFuZGUgZGlmZXJlbsOnYSBkbyBncm91bmRob2csIGluZGljYW5kbyB1bWEgZGF0YSBkZSB1c28gZG8gcGFjb3RlLiBFc3RhIGRhdGEgZnVuY2lvbmFyw6EgcGFyYSBiYWl4YXIgYSB2ZXJzw6NvIGRvIHBhY290ZSBtYWlzIHJlY2VudGUgdGVuZG8gY29tbyByZWZlcsOqbmNpYSBhIGRhdGEgaW5kaWNhZGEuDQoNCiMgRXhlcmPDrWNpbw0KDQpUZW50ZSBhcyBkdWFzIGZvcm1hcyBkZSBsZXIgcGFjb3RlcyBhcHJlc2VudGFkYXMgbmVzdGEgc2XDp8OjbywgdmVqYSBvIHF1ZSBtdWRvdSAob3UgbsOjbykgbm8gc2V1IGRpcmV0w7NyaW8uDQoNCiMgTGVpdHVyYXMgYWRpY2lvbmFpcw0KDQpQYXJhIG1haXMgaW5mb3JtYcOnw7VlcyBzb2JyZSBvIHBhY290ZSB7YHJlbnZgfSB2ZWphIGVzdGUgW21hdGVyaWFsXShodHRwczovL3JlcHJvZHVjaWJpbGl0eS5yb2Nrcy9tYXRlcmlhbHMvZGF5My8wMS1yZW52LykuIFBhcmEgbWFpcyBpbmZvcm1hw6fDtWVzIHNvYnJlIG8ge2Bncm91bmRob2dgfSB2ZWphIG8gW2Jsb2ddKGh0dHBzOi8vZGF0YWNvbGFkYS5vcmcvOTUjZm9vdG5vdGVfMl81ODUyKSBlc2NyaXRvIHBvciB1bSBkb3MgZGVzZW52b2x2ZWRvcmVzIGRvIHBhY290ZS4gQSBwcm9ww7NzaXRvLCBvIGJsb2cgW0RhdGEgQ29sYWRhXShodHRwczovL2RhdGFjb2xhZGEub3JnLykgw6kgdW1hIGZvbnRlIHNlbnNhY2lvbmFsIGRlIGlkZWlhcyBlIGRpc2N1c3PDtWVzIHNvYnJlIGNpw6puY2lhLCByZXByb2R1dGliaWxpZGFkZSBlIHR1ZG8gbyBtYWlzLg0KDQo=