From a2a2ebb6498e519ad845130b796e239ec0472e4d Mon Sep 17 00:00:00 2001 From: Walmes Zeviani <walmes@ufpr.br> Date: Mon, 21 Dec 2015 22:04:36 -0200 Subject: [PATCH] =?UTF-8?q?Inicia=20cap=C3=ADtulo=203=20de=20Estrutura=20d?= =?UTF-8?q?o=20Pacote.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cap03.Rmd | 550 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 550 insertions(+) create mode 100644 cap03.Rmd diff --git a/cap03.Rmd b/cap03.Rmd new file mode 100644 index 0000000..64d655e --- /dev/null +++ b/cap03.Rmd @@ -0,0 +1,550 @@ +--- +title: "Pacote R" +author: "Fernando Mayer & Walmes Zeviani" +--- + +```{r setup, include=FALSE} +library(knitr) + +opts_chunk$set( + dev.args=list(family = "Palatino")) + +options(width = 68) + +## Carrega as definições de sessão. +source("config.R") +rty <- "md" +``` + +**** +# Pacote R # + + * O jeito mais fácil de tornar acessível o código. + * Publicar artigo com material suplementar na forma de pacote. + +**** +# *devtools* & *roxygen2* # + + * Facilitam o desenvolvimento de um pacote R. + * Torna o processo mais simples para um usuário pouco experiente. + * Instalar os pacotes do CRAN e do GitHub. + +**** +# Estrutura de um pacote R # + +Basicamente um pacote do R é uma convenção para organizar e padronizar a +distribuição de funções extras do R. Todo pacote é composto +*obrigatoriamente* por apenas dois diretórios e dois arquivos de meta +dados: + + * `R/`: um diretório contendo as funções em arquivos `*.R` (ex.: + `foo.R`). + * `man/`: um diretório contendo a documentação (páginas de ajuda) de + cada função do diretório acima. Os arquivos de documentação do R + terminam com a extensão `.Rd` (ex.: `foo.Rd`). + * `DESCRIPTION`: um arquivo texto contendo as informações sobre o seu + pacote: título, descrição, autor(es), licença, pacotes do qual + dependende, etc. + * `NAMESPACE`: um arquivo texto que informa quais funções do seu + pacote serão exportadas, ou seja, aquelas que estarão disponíveis + para o usuário, e quais funções são importadas de outros pacotes dos + quais o seu depende. + +Outros componentes que não são obrigatórios, mas podem estar presentes +no pacote são: + + * `tests/`: um diretório contendo *scripts* com testes unitários, + rodados durante a criação do pacote, para testar se existe algum + resultado não esperado sendo retornado por alguma de suas funções. + * `vignettes/`: um diretório que contém uma ou mais *vignettes*, que + traduzidas literalmente são como "vinhetas", pequenos (ou mesmo + grandes) textos que explicam com mais detalhes como os usuários + podem usar as funções de seu pacote. + * `data/`: um diretório contendo arquivos de dados (normalmente em + formato binário e comprimido do R, `.rda` ou `.RData`), que podem + ser usados como exemplos para aplicação das funções do pacote. + +Ainda são comuns diretórios `demo/`, `src/` e +`data-raw/`. TODO-descrever. + +Caso você queira começar a contruir um pacote, as opções são: 1) criar +todos os componentes (diretórios e arquivos) manualmente e ir +alimentando com conteúdo, ou 2) usar a função `create()` do pacote +`devtools` para criar a estrutura inicial, com os arquivos e diretórios +fundamentais, de um pacote. Nesse guia optaremos pela segunda opção pela +já justificada praticidade. Portanto: + +```{r create, comment=NA, include=FALSE, purl=FALSE} +library(devtools) +if (dir.exists(paths="./meupacote")) { + unlink("./meupacote/", recursive = TRUE, force = TRUE) +} +``` +```{r, comment=NA, eval=TRUE} +## Carrega o pacote devtools. +library(devtools) +packageVersion("devtools") + +## Cria o pacote. +create("meupacote", rstudio = FALSE) +``` +```{r, include=FALSE} +## Guarda no NAMESPACE vazio para exibir lá na frente. +namespace <- readLines("./meupacote/NAMESPACE") +``` + +Versões do pacote `devtools` anteriores à 1.9.1 não criam +automaticamente o arquivo `DESCRIPTION`, apenas criam o diretório `R/` e +o arquivo `NAMESPACE`. Em caso de você estar com uma versão defazada do +`devtools`, instale a mais recente do +`r renderUrl("CRAN","https://cran.r-project.org/web/packages/devtools/index.html",rty)` +(estável) ou de desenvolvimento no GitHub do +`r renderUrl("autor","https://github.com/hadley/devtools",rty)`. + +Como pode ser observado na saída acima, esse comando cria um diretório +chamado `meupacote`, contendo os arquivos `DESCRIPTION` e `NAMESPACE` e +o diretório `R/`. + +```{r, echo=FALSE, comment=NA} +cat(system("tree --charset=ascii -F ./meupacote/ | head -n -2", + intern = TRUE), + sep = "\n") +``` + +O diretório `R/` é criado vazio, bem como o arquivo `NAMESPACE`. Já o +arquivo `DESCRIPTION` é criado com algumas informações de sugestão. + +```{r, echo=FALSE, comment=NA} +cat(readLines("./meupacote/DESCRIPTION"), sep = "\n") +``` + +Todo pacote precisa ter o arquivo que o descreve, o `DESCRIPTION`. Uma +forma fácil de criá-lo já com informações do seu pacote, é usando a +função `write.dcf()` (dfc: `Debian control format`) ou o comando +`cat()`, como é ilustrado a seguir. Depois de criado, sinta-se livre +para abrir com seu editor favorito, editar e ampliar. + +```{r, eval=FALSE} +write.dcf( + list(Package = "meupacote", + Title = "Meu Primeiro Pacote R", + Version = "0.0-1", + Author = "Fernando Mayer <fernandomayer@ufpr.br>", + Description = "O que esse pacote faz", + Depends = sprintf("R (>= %s)", getRversion()), + License = "GPL-3", + LazyData = "true"), + file = "meupacote/DESCRIPTION"), + indent = 4) + +cat() +``` +```{r} +cat(file = "meupacote/DESCRIPTION", sep = "\n", + sprintf('Package: meupacote +Title: Meu Primeiro Pacote R +Version: 0.0-1 +Authors@R: as.person(c( + "Fernando de Pol Mayer <fernando.mayer@ufpr.br> [aut,cre]", + "Walmes Marques Zeviani <walmes@ufpr.br> [aut]")) +Description: Esse é o primeiro pacoteque estamos fazendo. Nesse tutorial + o pacote será desenvolvido com funções, dados e vinheta. +Depends: + R (>= %s) +License: GPL-3 +URL: http://git.leg.ufpr.br/leg/prr +BugReports: http://git.leg.ufpr.br/leg/prr/issues +LazyData: true +Encoding: UTF-8', getRversion())) +``` + +Abaixo serão especificados os detalhes para a criação de cada um dos +componentes exibidos acima. + +## `DESCRIPTION`: Caracterização do pacote ## + +Como você já deve supor, o arquivo `DESCRIPTION` caracteriza o seu +pacote: quem é (são) o(s) autor(es), uma breve descrição do que ele faz, +qual o tipo de licença, quais pacotes são necessários para que o seu +funcione, e mais alguns detalhes. + +No arquivo `DESCRIPITION` uma série de +`r renderUrl("campos","http://r-pkgs.had.co.nz/description.html",rty)` é +permitida. Cada linha representa um campo, alguns obrigatórios (*) e +outros opcionais (#), e após os dois pontos é o valor. Campos que +excedem uma linha devem ser indentados. + + * `Package` (*): é o nome do pacote. Não deve conter espaços, deve + começar com uma letra e o restante deve ser + alfanumérico. Caracteres especiais, como pontuações e acentos, não + são permitidos. + * `Title` (*): é o título do seu pacote. Recomenda-se que, por ser um + título, seja curto e informativo. + * `Version` (*): é a versão do pacote. A versão inicia (ou atual do + pacote). O versionamento de qualquer pedaço de software é uma coisa + muito importante e não há um consenso de que exista um padrão para + todos os casos. No entanto, nos pacotes do R, recomenda-se que as + versões sejam do tipo `x.y-z` ou `x.y.z` onde `x` seria o contador + de versão "maior", `y` de versão "menor", e `z` de "patches" + (alterações menores no código, como correção de bugs por exemplo). + * `Author` ou `Authors@R` (*): lista os criadores, autores e + colaboradores do pacote. Existem várias formas de preencher esse + campo, sendo a mais simples àquele para um único autor e as duas + opções a seguir, equivalentes, para projetos coletivos. + + Authors@R: c( + person("Hadley", "Wickham", + email = "hadley@rstudio.com", + role = "cre"), + person("Winston", "Chang", + email = "winston@rstudio.com", + role = "aut")) + + Authors@R: as.person(c( + "Hadley Wickham <hadley@rstudio.com> [aut, cre]", + "Winston Chang <winston@rstudio.com> [aut]")) + O argumento `role` é importante pois é ele que identifica o papel + de cada autor no desenvolvimento do pacote. Por padrão, é + necessário ter um (e somente um) autor (`"aut"`) e um mantenedor + (`"cre"`), que pode ou não ser a mesma pessoa. Outros papéis, como + por exemplo o de um contribuidor (`"ctb"`), e outros detalhes dessa + função estão em `?person`. O criador ou mantenedor (`"cre"`) é + quase sempre o principal desenvolvedor do projeto, responsável pela + gestão e quem recebe notificações de *bugs*, por exemplo. O autor + (`"aut"`) é quem dá contribuições grandes ao projeto. O colaborador + `"ctb"` é quem dá contribuições menores, ocasionais. Pelo menos um + dos listados no campo autor deve ser o mantenedor (`[cre]`) para + evitar erros durante produção do pacote. + * `Description` (*): Uma descrição um pouco mais detalhada sobre o que + o seu pacote faz. É preciso ter pelo menos duas frases completas + (sim, o R confere isso), mas não muito maior do que um parágrafo, + algo com não mais de 10 linhas. + * `Imports` (#): é um campo para listar os pacotes do qual o seu + obrigatoriamente precisa. A lista de pacotes é separada por + vírgula, em geral um por linha. Aqui entram aqueles pacotes cujas + funções são usadas por você dentro das suas funções. Quando o seu + pacote for instalado, esses pacotes devem estar presentes. Aqueles + que são do CRAN (oficiais) são instados automaticamente. O usuário + deve instalar previamente àqueles que não forem oficiais, como + muitos no github e bioconductor. TODO:verificar Colocar um pacote + nesse campo garante que o pacote estará **instalado**, mas não que + ele será carregado toda que vez que o seu pacote for + carregado. Para utilizar funções de outros pacotes corretamente é + necessário especifições da forma `pacote::funcao()` ou então + utilizar o arquivo `NAMESPACE` conforme veremos abaixo. + * `Depends` (#): esse campo é muito similar ao anterior. A diferença é + que pacotes no `Imports` são carregados (*loaded*) e no `Depends` + são anexados (*attached*). + Dada essa diferença mínima, é muito comum só haver o campo + `Imports`. É comum o `Depends` indicar a versão do R que o seu + pacote depende. É sempre prudente colocar uma versão que seja maior + ou igual a versão que você está desevolvendo o pacote. Em ambos + campos é possível indicar a versão mínima exigida dos pacotes, + conforme abaixo. + + Depends: + R (>= 2.15), + lattice + Imports: + ggplot2, + Matrix (>= 1.2.0), + methods + * `Suggests` (#): é para listar os pacotes do qual o seu tira + proveito, mas que não são exigências. Aqui entram pacotes do qual o + seu chama uma função ou *dataset* na sessão exemplos da + documentação. O usuário precisará instalar aqueles que não + possuir. Diferente daqueles no `Imports` os pacotes listados aqui + não serão instalados junto com o seu. Eles podem ser usados, mas + não são necessários. Por exemplo, você pode usar um pacote apenas + para usar alguma base de dados ou apenas uma função. Use esse campo + apenas se o seu pacote puder funcionar mesmo sem os pacotes + especificados. + * `License` (#): A licença é fundamental se você pretende compartilhar + o seu pacote. Algumas opções comuns são: `CC0` (nenhum tipo de + restrição), `MIT` (prevê atribuição mas é bastante permissiva), e + `GPL-3` (a mais utilizada, requer que qualquer trabalho derivado do + seu seja distribuido com a mesma licença). Para mais opções e + detalhes sobre licenças de software livre, consulte + <http://choosealicense.com>. + * `LazyData` (#): Essa opção somente é importante se você pretende + distribuir algum conjunto de dados com o seu pacote (arquivos + `.rda` no diretório `data/`). Com a opção acima, os dados só serão + carregados se realmente forem chamados (com a função `data()`), e + não carregados na inicialização do pacote. Isso garante mais + agilidade para carregar o pacote e economiza memória caso os dados + não sejam utilizados (especialmente se as bases de dadpos forem + gandes). + * `URL` (#): um site de referencia onde você hospeda o pacote, por + exemplo. + * `BugReports` (#): normalmente endeços para sistemas de controle de + versão, como github e gitlab, onde os usuários podem submeter os + *bugs*. + * `Encoding` (#): É um campo extremamente necessário para nós de + lingua latina pois permite acentos na documentação do pacote, + testos de comentários, etc. Desenvolvedores Linux usam `UTF-8`. + * `VignetteBuilder` (#): Habilitou-se o uso do `knitr` a partir da + versão 3.0.0 do R para produção de + `r renderUrl("vinhetas","http://yihui.name/knitr/demo/vignette/",rty)`. + Estas podem ser escritas em RMarkDown (para html ou pdf), além de + ainda manter RLatex. Antes vinhetas tinham que ser feitas em + Sweave. Esse campo serve para indicar o pacote `knitr`, que também + deve aparecer, pelo menos, no campo `Suggests` também. + +Para podermos utilizar esse arquivo para de fato gerarmos um pacote de +exemplo ao final deste tutorial, vamos modificar alguns campos e +utilizar o seguinte arquivo `DESCRIPTION`: + +## `R/`: Funções + +O diretório `R/` irá conter apenas as funções (arquivos `.R`) do seu +pacote. As funções podem estar em vários arquivos `.R` separados (um +para cada função) ou em arquivos com várias funções cada. A escolha é +mais uma questão de preferência pessoal, mas como veremos mais adiante, +utilizar arquivos separados para as funções torna o processo de +documentação um pouco mais ágil, além de facilitar a manutenção do +pacote com o tempo. + +Para exemplificar, vamos criar uma função simples para resolver um +problema bem conhecido: calcular a hipotenusa de um triângulo retângulo +a partir dos catetos, cuja solução se baseia no Teorema de +Pitágoras. Vamos colocar a função no diretório diretório `R/` com o nome +`pitagoras.R`. + +```{r, eval=FALSE} +pitagoras <- function(a, b){ + h <- sqrt(a^2 + b^2) + return(h) +} +``` +```{r, include=FALSE} +file.copy(from = "./aux/pitagoras.R", to = "./meupacote/R/pitagoras.R") +``` + +Com a função pronta, possivelmente iremos (e devemos) testá-la. Para +carregá-la executamos a função `load_all()` do pacote `devtools` em uma +seção do R com diretório de trabalho apontando para o arquivo +`DESCRIPTION`. + +```{r, echo=TRUE, eval=FALSE} +## Carrega todas as funções do pacote. Assume estar em meupacote/. +load_all() +``` +```{r, echo=FALSE, eval=TRUE} +load_all("meupacote/") +``` +```{r} +## Note que o package:meupacote foi carregado. +search() + +## Os objetos exportados estão disponíveis. +ls("package:meupacote") + +## class(pitagoras); formals(pitagoras); body(pitagoras) +pitagoras +``` + +Essa instrução irá carregar todas as funções que estiverem dentro do +diretório `R/`, tornado-as disponíveis para uso. Além disso carrega os +datasets do diretório `data/` que veremos adiante. + +Se utilizassemos a função `source("R/pitagoras.R")` para carregar a +função teria o mesmo efeito: as funções estariam disponíveis para +uso. No entanto, se tivermos vários arquivos, e/ou estivermos testando +alterações em muitas funções, a função `load_all()` é bem mais +conveniente. Além do mais, as funções carregas com `load_all()` ficam no +*enviroment* do pacote (`package:meupacote`) e não no *workspace* junto +aos objetos de você cria durante a sessão, o `.GlobalEnv`. + +Para melhorar ou corrigir as funções, basta fazer as nos arquivos `.R`, +carregá-las com `load_all()` e testar novamente. Esse processo +geralmente se repete muitas vezes durante o desenvolvimento de um +pacote. + +## `man/`: Documentação + +Você deve ter notado que o diretório `man/` não é criado da mesma forma +que os demais quando utilizamos a função `create()`. Isso porque esse +diretório depende das funções, quatidade e nomes, que serão criadas +dentro do diretório `R/`. No entanto, ele também é obrigatório para +podermos criar um pacote mínimo. + +Como mencionado anteriormente, a documentação de funções do R segue um +formato muito parecido com o LaTeX (mas com alguns comandos +próprios). Cada função criada dentro do diretório `R/`, independente de +estar em um arquivo separado ou único (com várias funções), deve +**obrigatoriamente** ter um arquivo correspondente dentro do diretório +`man/`, com a extensão `.Rd`. Em outras palavras, mesmo que você decida +manter funções no mesmo arquivo em `R/`, as documentações delas estarão +em arquivos separdas em `man/`. Fica um pouco difícil de manter +correspondência e por isso é comum ter uma função por arquivo em +`R/`. Existes excessões. + +Sendo assim, a nossa função de exemplo acima, que está em um arquivo +chamado `pitagoras.R`, precisa de um arquivo `pitagoras.Rd` dentro do `man/` para +documentá-la. + +Existem duas formas de documentar uma função com os arquivos `.Rd`: uma +é da maneira tradicional, escrevendo manualmente a documentação +utilizando a linguagem específica e colocando os campos necessários. Os +detalhes de como fazer isso manualmente estão em +`r renderUrl("Writing R documentation files","http://cran.r-project.org/doc/manuals/r-release/R-exts.html",rty)`. +Outra forma de escrever a documentação de uma função é utilizando o +pacote `roxygen2`, que utiliza algumas etiquetas, ou *tags*, simples e +permite que você escreva a documentação dentro do próprio arquivo +`.R`. Dessa forma fica muito mais simples alterar ou atualizar a +documentação de uma função, pois tudo se concentra dentro de um único +arquivo. + +Neste texto vamos utilizar o pacote `roxygen2` para gerar a documentação +das funções. O primeiro passo é escrever a documentação dentro do +arquivo `.R`. A documentação usando o `roxygen2` segue o seguinte +formato: + + * Toda documentação começa com um comentário especial, do tipo `#'` + (note o `'` depois do `#`). + * Os campos de documentação são criados a parir de etiquetas (*tags*) + que iniciam com `@`, colocados logo após um comentário especial + `#'`. + * Toda a documentação deve ficar diretamente acima do início da + função. + +A documentação com o `roxygen2` da nossa função `pitagoras()` é exibida +a seguir. + +```{r, echo=FALSE, comment=NA} +cat(readLines("meupacote/R/pitagoras.R"), sep = "\n") +``` + +Para gerar a documentação, basta utilizar a função `document()` do +pacote `devtools`. + +```{r, echo=TRUE, eval=FALSE} +## Gera/autualiza do diretório man/ com as documentações. +document() +``` +```{r, echo=FALSE, eval=TRUE} +document("meupacote/") +``` +```{r, echo=FALSE, comment=NA} +cat(system("tree --charset=ascii -F ./meupacote/ | head -n -2", + intern = TRUE), + sep = "\n") +``` + +O resultado da chamada dessa função é: + + * Criar o diretório `man/` se ele ainda não existir, ou se for a + primeira vez que estiver criando a documentação com a função + `document()`. + * Gerar os arquivos `.Rd` dentro de `man/` (se ainda não existirem) + correspondentes às funções no diretório `.R`. + * Se os arquivos `.Rd` já existirem, a chamada da função `document()` + irá apenas atualizar os arquivos que foram modificados. + * Escrever no arquivo `NAMESPACE` as funções a serem exportadas ou + importadas. Veremos mais detalhes abaixo na seção `NAMESPACE`. + +Vale ressaltar que o comando `document()` do pacote `devtools` é de fato +um "wrapper" para a função `roxygenize()` do pacote `roxygen2`. + +No nosso exemplo, a chamada da função `document()` criou o diretório +`man/` e gerou o arquivo `pitagoras.Rd`. Note que é muito mais simples +escrever com o `roxygen2` do que ter que editar esse arquivo todo a +mão. Note também o comentário no início desse arquivo. O `roxygen2` +deixa claro que você não deve (e não precisa) modificar esse arquivo +`pitagoras.Rd` para atualizar a documentação. Sempre que alterar alguma +coisa faça no próprio arquivo `.R`, e a função `document()` irá +atualizar a documentação no arquivo `.Rd`. + +```{r, echo=FALSE, comment=NA} +cat(readLines("./meupacote/man/pitagoras.Rd"), sep = "\n") +``` + +Para conferir se a documentação está de acordo com o que você espera, a +qualquer momento, peça a documentação com `?pitagoras` ou +`help(pitagoras)`. Lembre-se de rodar a função `load_all()` para +carregar a documentação atualizada depois de `document()`. + +Uma outra forma mais automática de conferir se a documentação está +escrita de maneira correta, é utilizando a função `check_doc()` do +pacote `devtools`. Essa função avalia a consistência dos campos, se não +ficaram argumentos sem descrição, campos obrigatórios omissos, chaves +sem fechar, etc. + +```{r, echo=TRUE, eval=FALSE} +check_doc() +``` +```{r, echo=FALSE, eval=TRUE} +check_doc("meupacote/") +``` + +Se nenhuma mensagem de aviso ou erro apareceu acima, então a +documentação está de acordo com o esperado, sintaticamente. + +Alguns detalhes das etiquetas utilizadas nesse exemplo do +`roxygen2` (<http://r-pkgs.had.co.nz/man.html>): + + * `@title`: um título curto da função (deve ser capitalizado). + * `@name`: o nome da função. + * `@description`: descreve o que a função faz e pra que ela serve, de + maneira geral. + * `@param`: descreve o que cada argumento da função faz. Deve ser + sempre no formato: `@param argumento descrição do argumento`. Quando + vários argumentos podem ser descritos juntos, eles devem ser + separados por vírgula mas sem espaços. + + @param title título do gráfico + @param x,y,z vetores de observações + @param ... argumentos passados para a função plot. + * `@details`: espaço para escrever mais detalhes, geralmente mais + técnicos, sobre a sua função, e/ou para detalhar alguma coisa + específica de algum argumento. + * `@return`: especifica o que a sua função retorna (um gráfico, uma + lista, um número, um vetor, um objeto de determinada classe). + * `@author`: autr(es) da função. + * `@seealso`: outras funções que podem ser úteis para quem está usando + a sua função, ou funções similares. No exemplo acima temos duas + marcações que são específicas da documentação do R: `\code{}` para + que o texto dentro das chaves saia com fonte monoespaço e verbatim + (`como esta`), geralmente para especificar nomes de funções, etc.; + `\link[<pacote>]{<função>}` faz o link para a página de ajuda de + alguma `<função>` dentro de algum `<pacote>`. Mais marcações do + formato `.Rd` podem ser encontradas no manual de documentação do R, + e podem ser utilizadas dentro na documentação com `roxygen2`. + * `@example`: exemplos de uso da sua função. + * `@export`: esta tag é a responsável por sua função ficar disponível + para os usuários, e é o que faz a função ser incluida no `NAMESPACE` + (mais detalhes serão vistos na seção `NAMESPACE` abaixo). Se você + não quer que a função seja disponibilizada para os usuários quando + carregarem o seu pacote (em funções internas ou auxiliares por + exemplo), simplesmente não inclua esta tag na documentação. + * `@source` É um campo considerado na documentação de *datasets* para + indicar a fonte dos mesmos. Geralmente contém uma url. + * `@references` É um campo para indicar publicações ou outros tipos de + referências com relação ao objeto documentado. + +Existem ainda campos permitidos que não foram aqui mencionados. A +`r renderUrl("vinheta","https://cran.r-project.org/web/packages/roxygen2/vignettes/rd.html",rty)` +do pacote `roxygen2` +lista todo o conjunto enquanto que uma referência fácil é o +`r renderUrl("*Cheat Sheet*","https://www.rstudio.com/wp-content/uploads/2015/03/devtools-cheatsheet.pdf",rty)` +do pacote `devtools`. + +## `NAMESPACE`: Organização + +<!-- http://r-pkgs.had.co.nz/namespace.html --> + +O `NAMESPACE` é um arquivo que ajuda a organizar as funções exportadas e +importadas pelo seu pacote. Ele ajuda um pacote a ser auto contido, no +sentido de que ele não vai interferir no funcionamento de outros +pacotes, e que também os outros pacotes não irão interferir no +funcionamento do seu. + +Normalmente, a especificação do `NAMESPACE` é a parte mais difícil da +criação de um pacote, mas com o uso do `devtools` como estamos fazendo, +normalmente não será necessário se preocupar com todos os detalhes que +envolvem esse arquivo. O mais importante é saber quais funções serão +exportadas do seu pacote, quais serão importadas, e de que maneira +podemos especificar essas funções. + +**** +# Começando um pacote # -- GitLab