[{"content":"Motivação Acredito que a discussão mais comum nos times de ciência de dados seja R vs Python. Eu me vi em algumas dessas discussões algumas vezes e minha posição é sempre \u0026ldquo;Por que não usar os dois?\u0026rdquo;. A ideia deste post não é comparar R vs Python, mas mostrar como é fácil integrar as duas linguagens usando APIs (COMO UM PROFISSIONAL); dessa forma, podemos usar o melhor de cada uma. Além disso, o post não vai focar na publicação e na estrutura necessárias para colocar as APIs online; em vez disso, vou demonstrar localmente (para simplificar).\nEste post está dividido em 3 seções: Criando uma função, Criando uma API e Chamando uma API. Na primeira seção, você encontrará uma função simples criada em R e Python; a segunda seção é sobre como transformar essas funções em APIs; a última é sobre como podemos chamar/usar as APIs.\nCriando uma função Imagine que você está trabalhando em um time de ciência de dados e alguém precisa de um pedaço de código que retorne a soma de dois valores (desculpe pelo exemplo bobo). Veja, a solicitação não é sobre R, Python, Julia, Java ou qualquer outra coisa, mas sim resolver o problema! Então, vamos resolver o problema da melhor forma que pudermos e escrever uma função para resolvê-lo em R e Python.\nEste post não vai cobrir as diretrizes para criar funções úteis. Para isso, recomendo que você dê uma olhada na seção Functions do Advanced R Book.\nFunção em R Uma função simples para retornar a soma de dois valores em R seria assim:\nsum_two_r \u0026lt;- function(x, y) { result \u0026lt;- x + y return(result) } Pronto; agora podemos chamá-la dentro do R assim:\nsum_two_r(x = 1, y = 1) ## [1] 2 Função em Python Uma função simples para retornar a soma de dois valores em Python seria assim:\ndef sum_two_python(x, y): result = x + y return result Pronto; agora podemos chamá-la dentro do Python assim:\nsum_two_python(x = 1, y = 1) ## 2 Criando uma API O problema está quase resolvido, mas ainda precisamos encontrar a melhor forma de compartilhar nossa solução com o resto do time. Bem, a parte do time que trabalha em R pode usar a função que escrevemos em R, mas essa função simplesmente não está disponível para a parte do time que usa Python; o mesmo acontece com o código escrito em Python, que simplesmente não está disponível para quem usa R. Então, é necessário criar uma solução independente da linguagem para torná-la acessível a todos do time.\nEu sei que o pacote reticulate pode ajudar, mas é uma solução de mão única, e estamos interessados em uma forma mais genérica de integração que possa ser estendida não apenas ao Python, mas a qualquer linguagem de programação.\nUma boa solução seria criar e publicar uma API com nosso pedaço de código; dessa forma, o resto do time pode interagir com ela de forma independente; em outras palavras, não importa mais qual foi a linguagem que você usou para resolver o problema. Para isso, vamos usar o pacote plumber para R e o pacote FastAPI para Python.\nEste post não vai cobrir como publicar as APIs. No entanto, se você tiver interesse em aprender como colocar suas APIs online, pode usar este link para plumber e este link para FastAPI.\nAPI em R O primeiro passo para criar uma API em R é instalar o pacote plumber:\ninstall.packages(\u0026#34;plumber\u0026#34;) Feito isso, vamos voltar ao nosso arquivo de função e adicionar algumas coisas a ele.\n#* @param x first number #* @param y second number #* @get /sum_r sum_two_r \u0026lt;- function(x, y) { result \u0026lt;- as.numeric(x) + as.numeric(y) return(result) } Note que adicionamos alguns \u0026ldquo;comentários\u0026rdquo; no início do código, muito parecidos com os usados no pacote roxygen2. Esses comentários são a chave que o plumber usa para transformar suas funções em endpoints de APIs. Além disso, neste exemplo definimos uma solicitação GET; o mesmo poderia ser feito, por exemplo, com solicitações POST, mudando o comentário para #* @post /sum_r.\nSe você não está familiarizado com solicitações HTTP, pode dar uma olhada neste link.\nVocê pode ver que foi incluída a transformação as.numeric(), que é necessária porque os parâmetros \u0026ldquo;entram\u0026rdquo; no R como strings, e para aplicar operações matemáticas é necessário transformar os numéricos em números.\nO próximo passo é publicá-la! Para colocá-la online, você só precisa informar o caminho do arquivo e a porta em que quer expor a API. Vamos disponibilizá-la localmente (localhost) na porta 8000 executando:\nlibrary(magrittr) library(plumber) pr(\u0026#39;functions/sum_r.R\u0026#39;) %\u0026gt;% pr_run(port = 8000) Pronto! Agora nossa API está exposta e você pode acessar a documentação Swagger em http://localhost:8000/docs/ e interagir com ela pressionando GET, seguido do botão Try it out, preenchendo os parâmetros e pressionando Execute.\nSe quiser aprender mais sobre o Swagger UI, aqui está o link para você.\nAPI em Python O primeiro passo para criar uma API em Python é instalar o pacote FastAPI. No terminal, execute:\n$ pip install fastapi[all] Feito isso, vamos voltar ao nosso arquivo de função e adicionar algumas coisas a ele.\nfrom fastapi import FastAPI app = FastAPI() @app.get(\u0026#34;/sum_py\u0026#34;) def sum_two_python(x:float, y:float): result = x + y return result Note que importamos o pacote fastapi e criamos um objeto chamado app, que é uma instância do FastAPI. Depois, definimos isso como uma solicitação GET; o mesmo poderia ser feito, por exemplo, com solicitações POST, mudando para @app.post(\u0026quot;/sum_py\u0026quot;).\nVocê pode ver que foi incluído o :float para forçar o tipo da variável a ser numérico; isso é necessário porque, por padrão, as chamadas de API \u0026ldquo;entram\u0026rdquo; no Python como strings, e para aplicar operações matemáticas é necessário transformar os numéricos em números.\nO próximo passo é publicá-la! Para colocá-la online, você só precisa abrir o terminal e entrar na pasta onde salvou o script da sua API Python. Nomeei meu arquivo como \u0026ldquo;sum_py\u0026rdquo; e vou disponibilizá-lo localmente (localhost) na porta 8080 executando:\n$ uvicorn sum_py:app --port 8080 --reload A opção reload recarregará sua API toda vez que você salvar o arquivo. É um recurso muito bom para desenvolvimento!\nPronto! Agora nossa API está exposta e você pode acessar a documentação Swagger em http://localhost:8080/docs#/ e interagir com ela pressionando GET, seguido do botão Try it out, preenchendo os parâmetros e pressionando Execute.\nÉ claro que, no mundo real, a publicação das suas APIs não deveria ser local, mas a lógica será (quase) a mesma. Além disso, há MUITOS MAIS RECURSOS no desenvolvimento de APIs, então meu conselho seria ler a documentação do plumber e do FastAPI para aprender mais sobre isso.\nChamando uma API A partir de agora, a solução deve estar disponível para TODOS no time, usem eles Python, R, etc. Agora as coisas vão ficar malucas, porque vamos chamar a API Python no R e a API R no Python!!! 😵\nPS: Mantenha as duas APIs rodando localmente!\nChamando uma API em R É muito simples chamar APIs usando R; para isso, vamos usar o pacote httr. Vamos instalá-lo:\ninstall.packages(\u0026#34;httr\u0026#34;) Você se lembra que nossa API Python está rodando localmente (localhost) na porta 8080? Bem, isso e o tipo de solicitação (GET, neste caso) são as únicas informações de que precisamos para chamá-la pelo R.\nlibrary(httr) python_request \u0026lt;- GET(\u0026#39;http://localhost:8080/sum_py?x=1\u0026amp;y=1\u0026#39;) python_result \u0026lt;- content(python_request) python_result ## [1] 2 Chamando uma API em Python Vamos fazer o mesmo, mas desta vez vamos chamar a API R pelo Python! Para isso, será necessário instalar o pacote requests.\n$ pip install requests Nossa API R também está rodando em localhost, mas na porta 8000. Novamente, isso e o tipo de solicitação (GET, neste caso) são as únicas informações de que precisamos para chamá-la pelo Python.\nimport requests r_request = requests.get(\u0026#34;http://localhost:8000/sum_r?x=1\u0026amp;y=1\u0026#34;) print(r_request.json()) ## [2] Isso é tudo Há MUITO MAIS a discutir quando falamos de APIs/publicação/chamadas/solicitações, mas a ideia era simplificar, demonstrar as possibilidades e ACABAR COM A BRIGA entre R e Python 😆. Acredito que este post seja um bom exemplo de como integrar as duas linguagens (COMO UM PROFISSIONAL), porque, no fim, queremos RESOLVER O PROBLEMA!!! Realmente importa se você resolveu em Python ou R?\nEspero que alguém ache isso útil. Como sempre, seu feedback é muito bem-vindo; fique à vontade para entrar em contato comigo pelas redes sociais! 😄\n","permalink":"https://adsoncostanzifilho.github.io/pt/blog/why-not-both/","summary":"\u003ch2 id=\"motivação\"\u003eMotivação\u003c/h2\u003e\n\u003cp\u003eAcredito que a discussão mais comum nos times de ciência de dados seja R vs Python. Eu me vi em algumas dessas discussões algumas vezes e minha posição é sempre \u0026ldquo;\u003cem\u003ePor que não usar os dois?\u003c/em\u003e\u0026rdquo;. A ideia deste post não é comparar R vs Python, mas mostrar como é fácil \u003cstrong\u003eintegrar as duas linguagens usando APIs\u003c/strong\u003e (COMO UM PROFISSIONAL); dessa forma, podemos usar o melhor de cada uma. Além disso, o post não vai focar na publicação e na estrutura necessárias para colocar as APIs online; em vez disso, vou demonstrar localmente (para simplificar).\u003c/p\u003e","title":"Por que não os dois?"},{"content":"Motivação Recentemente, alguns amigos me apresentaram ao GitHub Actions e ao quanto ele poderia me ajudar a executar tarefas como: publicar meus Shiny Apps, publicar este Blogdown, realizar testes automatizados em pacotes, atualizar dados e muito mais. Então, decidi experimentar, e foi tão simples e me poupou tantas horas de trabalho que decidi escrever este post explicando como desenvolvedores R podem fazer bom uso dessa ferramenta incrível.\nPrimeiro, as referências que usei para começar no GitHub Actions:\nA apresentação do Jim Hester na RStudio Conference aqui.\nO repositório GitHub Actions for the R language aqui.\nA Documentação do GitHub Actions aqui.\nComeçando com usethis A forma mais fácil e rápida de começar com o GitHub Actions no R é, com certeza, usando o pacote usethis! Então, vamos primeiro instalá-lo.\ninstall.packages(\u0026#34;usethis\u0026#34;) A primeira função muito interessante sobre o GitHub Action no pacote usethis é a usethis::browse_github_actions(); com essa função, você pode ver as actions ativas rodando nos mais diversos pacotes R. Esse é um ótimo começo para te dar uma ideia de quais Actions são usadas em grandes pacotes R como \u0026ldquo;shiny\u0026rdquo;, \u0026ldquo;dplyr\u0026rdquo;, etc.\nO usethis também tem a função usethis::use_github_action(), que na minha opinião é a forma mais fácil de começar. Ela criará para você a estrutura de arquivos/pastas necessária para o GitHub entender e executar suas Actions; em outras palavras, ela criará a estrutura .github folder \u0026gt; workflows folder \u0026gt; .yaml file dentro do caminho do seu projeto atual. Essa função também precisa, como argumento, de um nome específico de workflow (você pode conferir as opções disponíveis aqui); dependendo da opção escolhida, ela pode te dar um ótimo ponto de partida (às vezes você nem precisa mudar nada). Por exemplo, se você executar usethis::use_github_action(\u0026quot;pkgdown\u0026quot;), ela criará para você a estrutura de pastas padrão (.github folder \u0026gt; workflows folder \u0026gt; file.yaml) e iniciará um arquivo .yaml assim:\non: push: branches: - main - master name: pkgdown jobs: pkgdown: runs-on: macOS-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v2 - uses: r-lib/actions/setup-r@v1 - uses: r-lib/actions/setup-pandoc@v1 - name: Query dependencies run: | install.packages(\u0026#39;remotes\u0026#39;) saveRDS(remotes::dev_package_deps(dependencies = TRUE), \u0026#34;.github/depends.Rds\u0026#34;, version = 2) writeLines(sprintf(\u0026#34;R-%i.%i\u0026#34;, getRversion()$major, getRversion()$minor), \u0026#34;.github/R-version\u0026#34;) shell: Rscript {0} - name: Restore R package cache uses: actions/cache@v2 with: path: ${{ env.R_LIBS_USER }} key: ${{ runner.os }}-${{ hashFiles(\u0026#39;.github/R-version\u0026#39;) }}-1-${{ hashFiles(\u0026#39;.github/depends.Rds\u0026#39;) }} restore-keys: ${{ runner.os }}-${{ hashFiles(\u0026#39;.github/R-version\u0026#39;) }}-1- - name: Install dependencies run: | remotes::install_deps(dependencies = TRUE) install.packages(\u0026#34;pkgdown\u0026#34;, type = \u0026#34;binary\u0026#34;) shell: Rscript {0} - name: Install package run: R CMD INSTALL . - name: Deploy package run: | git config --local user.email \u0026#34;actions@github.com\u0026#34; git config --local user.name \u0026#34;GitHub Actions\u0026#34; Rscript -e \u0026#39;pkgdown::deploy_to_branch(new_process = FALSE)\u0026#39; Vamos cobrir os passos apresentados dentro do arquivo .yaml mais adiante, bem como apresentar alguns workflows específicos para:\nPublicar seu shiny no shinyapps.io automaticamente\nPublicar sua página do blogdown no GitHub Pages automaticamente.\nRealizar testes automáticos nos seus pacotes R.\nAgendar algumas rotinas.\nLembre-se: o GitHub só executará os arquivos .yaml dentro da pasta workflows (que fica dentro da pasta .github)!\nPublicação Automática do Shiny Como seria incrível se, toda vez que você desse \u0026ldquo;push\u0026rdquo; em um novo recurso no seu repositório shiny no GitHub, ele executasse automaticamente os procedimentos de publicação para colocar a nova versão do seu aplicativo online no shinyapps.io? Graças ao GitHub Actions, isso agora é possível!\nAntes de começarmos a criar um procedimento de Action para publicar seus shiny apps no shinyapps.io, devemos criar a estrutura de pastas que o GitHub precisa. Então, vamos criar a pasta .github e, dentro dela, devemos criar a pasta workflows; só então podemos começar nosso arquivo .yaml.\nAgora que temos a estrutura, podemos começar a desenvolver nosso procedimento de publicação. A primeira coisa a fazer é definir qual trigger queremos usar para \u0026ldquo;ativar\u0026rdquo; a GitHub Action. Digamos que queremos que o GitHub execute isso toda vez que fizermos push no master branch. Então, nosso arquivo deve começar assim:\n# Triggered on push branch master on: push: branches: [ master ] O segundo passo é definir o nome do workflow e o sistema operacional que você quer. O GitHub Actions tem várias opções de SO para escolher, incluindo os 3 mais populares: ubuntu, macos e windows. Vou nomear nosso procedimento como \u0026ldquo;Shiny-Deploy\u0026rdquo; e vamos usar o macos-10.15.\nVocê pode associar suas actions a badges com o pacote usethis. Por exemplo, se o nome do seu workflow for \u0026ldquo;Shiny-Deploy\u0026rdquo;, você pode adicionar esse badge no seu arquivo README executando usethis::use_github_actions_badge(\u0026quot;Shiny-Deploy\u0026quot;).\n# Name of the workflow - usethis::use_github_actions_badge(\u0026#34;Shiny-Deploy\u0026#34;) name: Shiny-Deploy # Set the job, the machine and the R version jobs: Shiny-Deploy: runs-on: macos-10.15 strategy: matrix: r-version: [4.0.2] Agora que já temos nossa máquina do GitHub Actions, podemos começar a desenvolver os passos! Primeiro, vamos clonar o repositório a partir da branch respectiva que disparou a action.\nPS: daqui em diante, todas as actions estarão \u0026ldquo;dentro\u0026rdquo; da estrutura steps.\nsteps: # Cloning your repository from the respective branch that has triggered it - uses: actions/checkout@v2 Legal! Já fizemos uma cópia dos nossos arquivos; agora precisamos configurar a instalação do R na nossa máquina do GitHub Actions para conseguir executar nossos scripts R. Também vamos configurar o pandoc para compilar nossos scripts shiny ou Rmarkdown.\n# set-up an R installation in our GHA machine to run our scripts - name: Set up R ${{ matrix.r-version }} uses: r-lib/actions/setup-R@v1 # for macos with: r-version: ${{ matrix.r-version }} # We will also need pandoc to compile our Shiny or RMarkdown report - name: Setting up pandoc uses: r-lib/actions/setup-pandoc@v1 A partir de agora, podemos executar alguns scripts R diretamente no shell da nossa máquina do GitHub Actions. Portanto, nosso próximo passo será instalar todos os pacotes que seu shiny app precisa. Obviamente, esse passo mudará dependendo dos pacotes que você usou para construir seu aplicativo.\nNão se esqueça de incluir o pacote rsconnect! Vamos usar esse pacote para conectar nossa máquina do GitHub ao servidor shinyapps.\n# Install R packages - name: Install dependencies run: | install.packages(c( \u0026#34;rsconnect\u0026#34;, \u0026#34;dplyr\u0026#34;, \u0026#34;shiny\u0026#34;, \u0026#34;shinyjs\u0026#34;, \u0026#34;shinyWidgets\u0026#34;, \u0026#34;shinyalert\u0026#34;, \u0026#34;shinycssloaders\u0026#34;, \u0026#34;evaluate\u0026#34;, \u0026#34;highr\u0026#34;, \u0026#34;knitr\u0026#34;, \u0026#34;markdown\u0026#34;, \u0026#34;rmarkdown\u0026#34;, \u0026#34;stringi\u0026#34;, \u0026#34;stringr\u0026#34;, \u0026#34;tinytex\u0026#34;, \u0026#34;xfun\u0026#34; )) shell: Rscript {0} Agora vem a parte complicada! Para fazer a conexão entre sua máquina do GitHub Actions e sua conta de shiny apps, precisamos configurar seu token e chave de shiny apps. Evidentemente, por razões de segurança, você não quer publicar suas credenciais do shinyapps para todos que acessam seu repositório do GitHub. No entanto, também precisamos do seu token e chave para conseguir publicar seu aplicativo automaticamente; é por isso que vamos usar o recurso de GitHub Secrets!\nPrimeiro, você precisa ir até sua conta de shiny apps, clicar no seu nome de perfil e entrar na opção de tokens.\nSe você ainda não criou seus tokens do shinyapps, ou se quiser usar um novo, pode clicar no botão + Add Token. Depois de fazer isso, uma nova linha aparecerá e você poderá ver seu Token, mas não seu Secret. Você precisa pressionar o botão Show e, em seguida, o Show Secret para conseguir copiar sua credencial Secret.\nAgora precisamos incluir essas credenciais nos GitHub Secrets! Para isso, você precisa entrar na página do seu repositório no GitHub e ir em Settings.\nNo menu à esquerda, você deve conseguir ver a opção Secrets. Ao entrar na aba Secrets, você verá o título \u0026ldquo;Actions secrets\u0026rdquo; e, logo ao lado, o botão \u0026ldquo;New repository secret\u0026rdquo;. Você precisa clicar nesse botão para criar suas variáveis de ambiente criptografadas (neste caso, suas credenciais do shinyapps).\nVamos criar 2 variáveis de ambiente diferentes: a primeira chamada \u0026ldquo;SHINYAPP_TOKEN\u0026rdquo; e a segunda chamada \u0026ldquo;SHINYAPP_SECRET\u0026rdquo; (é claro que você pode definir qualquer nome que quiser). Depois de clicar no botão \u0026ldquo;New repository secret\u0026rdquo;, você precisará fornecer o nome da sua variável e o valor dela e pressionar \u0026ldquo;Add Secret\u0026rdquo;, como você pode ver abaixo.\nSeu Secret e Token não precisam estar entre aspas (\u0026ldquo;my token\u0026rdquo;)!\nOk, agora podemos usar essas duas variáveis dentro do nosso arquivo .yaml e devemos conseguir publicar nosso aplicativo no servidor shinyapps! Você também deve fornecer o nome da sua conta shinyapps, o nome do seu aplicativo e o diretório dos scripts do seu aplicativo. Claro, você pode definir tudo isso usando os GitHub Secrets se quiser.\n# Connect on shinyapps server - name: Connect to ShinyApps env: # set the shinyapps keys as environment variables SHINY_TOKEN: ${{ secrets.SHINYAPP_TOKEN }} SHINY_SECRET: ${{ secrets.SHINYAPP_SECRET }} run: | shiny_token = Sys.getenv(\u0026#34;SHINY_TOKEN\u0026#34;) shiny_secret = Sys.getenv(\u0026#34;SHINY_SECRET\u0026#34;) rsconnect::setAccountInfo(name = \u0026#39;adsoncostanzi\u0026#39;, token = shiny_token, secret = shiny_secret) shell: Rscript {0} # deploy the app on shinyapps server - name: Deploy to shinyapps.io run: | rsconnect::deployApp(appName = \u0026#34;soothsayeR\u0026#34;, appDir = \u0026#34;app\u0026#34;) shell: Rscript {0} É isso aí: agora o GitHub publicará seu shiny no shinyapps toda vez que você der \u0026ldquo;push\u0026rdquo; no master branch!\nPara facilitar o copiar e colar, aqui está o arquivo .yaml completo!\nSiga a indentação; ela é uma parte essencial do código!\n# Triggered on push branch master on: push: branches: [ master ] # Name of the workflow - usethis::use_github_actions_badge(\u0026#34;Shiny-Deploy\u0026#34;) name: Shiny-Deploy # Set the job, the machine and the R version jobs: Shiny-Deploy: #runs-on: ubuntu-latest runs-on: macos-10.15 strategy: matrix: r-version: [4.0.2] steps: # Cloning your repository from the respective branch that has triggered it - uses: actions/checkout@v2 # set-up an R installation in our GHA machine to run our scripts - name: Set up R ${{ matrix.r-version }} uses: r-lib/actions/setup-R@v1 # for macos with: r-version: ${{ matrix.r-version }} # We will also need pandoc to compile our Shiny or RMarkdown report - name: Setting up pandoc uses: r-lib/actions/setup-pandoc@v1 # Install R packages - name: Install dependencies run: | install.packages(c( \u0026#34;rsconnect\u0026#34;, \u0026#34;dplyr\u0026#34;, \u0026#34;shiny\u0026#34;, \u0026#34;shinyjs\u0026#34;, \u0026#34;shinyWidgets\u0026#34;, \u0026#34;shinyalert\u0026#34;, \u0026#34;shinycssloaders\u0026#34;, \u0026#34;evaluate\u0026#34;, \u0026#34;highr\u0026#34;, \u0026#34;knitr\u0026#34;, \u0026#34;markdown\u0026#34;, \u0026#34;rmarkdown\u0026#34;, \u0026#34;stringi\u0026#34;, \u0026#34;stringr\u0026#34;, \u0026#34;tinytex\u0026#34;, \u0026#34;xfun\u0026#34; )) shell: Rscript {0} # Connect in shinyapps server - name: Connect to ShinyApps env: # set the shinyapps keys as environment variables SHINY_TOKEN: ${{ secrets.SHINYAPP_TOKEN }} SHINY_SECRET: ${{ secrets.SHINYAPP_SECRET }} run: | shiny_token = Sys.getenv(\u0026#34;SHINY_TOKEN\u0026#34;) shiny_secret = Sys.getenv(\u0026#34;SHINY_SECRET\u0026#34;) rsconnect::setAccountInfo(name = \u0026#39;adsoncostanzi\u0026#39;, token = shiny_token, secret = shiny_secret) shell: Rscript {0} # deploy the app on shinyapps server - name: Deploy to shinyapps.io run: | rsconnect::deployApp(appName = \u0026#34;soothsayeR\u0026#34;, appDir = \u0026#34;app\u0026#34;) shell: Rscript {0} Publicação Automática do Blogdown Que tal tornar a publicação do seu blogdown automática no GitHub Pages? Toda vez que você escrever um novo post, só precisará dar \u0026ldquo;push\u0026rdquo; e o GitHub Actions cuidará do resto! Esse procedimento funciona de forma muito parecida com o do shiny, então vamos começar nosso arquivo .yaml!\nPara a publicação do blogdown, vamos usar duas branches diferentes: a primeira chamada \u0026ldquo;source\u0026rdquo;, que conterá o lado de desenvolvimento do nosso blogdown. E a branch \u0026ldquo;master\u0026rdquo;, que exporá a página construída (a master branch receberá o resultado de blogdown::build_site(local = FALSE)).\nA master branch DEVE ser a que contém o conteúdo de build_site()!\nDessa forma, definiremos nosso trigger como um \u0026ldquo;push\u0026rdquo; na branch \u0026ldquo;source\u0026rdquo;:\n# Triggered on push branch source on: push: branches: - source No próximo passo, vamos definir o nome do workflow e o SO que queremos usar. Para este exemplo, vamos nomear nosso workflow como \u0026ldquo;deployblog\u0026rdquo; e o SO será um Ubuntu 18.04.\n# Name of the workflow - usethis::use_github_actions_badge(\u0026#34;deployblog\u0026#34;) name: deployblog # Set the job, the machine jobs: deployblog: name: Render and deploy blogdown runs-on: ubuntu-18.04 A parte mais fácil está feita; agora vamos começar os passos! Então, vamos clonar o repositório (na branch \u0026ldquo;source\u0026rdquo;) e configurar o R e o pandoc, como fizemos na seção de publicação do shiny.\nPS: daqui em diante, todas as actions estarão \u0026ldquo;dentro\u0026rdquo; da estrutura steps.\nsteps: # Cloning your repository from the respective branch that has triggered it - uses: actions/checkout@v2 with: submodules: true fetch-depth: 0 # set-up an R installation in our GHA machine to run our scripts - uses: r-lib/actions/setup-r@v1 # We will also need pandoc to compile our Shiny or RMarkdown report - uses: r-lib/actions/setup-pandoc@v1 Agora que temos nossos scripts e o R configurado, podemos prosseguir com a instalação dos pacotes, bem como instalar o HUGO, da seguinte forma:\n# Install R packages - name: Install r packages run: | Rscript -e \u0026#39;install.packages(c(\u0026#34;remotes\u0026#34;, \u0026#34;rmarkdown\u0026#34;))\u0026#39; \\ -e \u0026#39;remotes::install_github(\u0026#34;rstudio/blogdown\u0026#34;)\u0026#39; - name: install hugo # Install Hugo run: Rscript -e \u0026#39;blogdown::install_hugo(extended = TRUE, version = \u0026#34;0.78.2\u0026#34;)\u0026#39; - name: Get themes run: git submodule update --remote Terminado isso, devemos conseguir renderizar/construir nosso blogdown em uma pasta específica (neste caso, será a pasta \u0026ldquo;public\u0026rdquo;) usando a função blogdown::build_site(local = FALSE). Feito isso, basta dar push no conteúdo da pasta \u0026ldquo;public\u0026rdquo; para a master branch, e seu blogdown estará online no GitHub Pages!\n- name: Look at files run: ls ./public - name: Render blog run: Rscript -e \u0026#39;blogdown::build_site(local = FALSE)\u0026#39; - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_branch: master Eu ROUBEI ESTE SCRIPT DO MEU GRANDE AMIGO LUCAS GODOY (ele também me ensinou a fazê-lo funcionar)!\nPara facilitar o copiar e colar, aqui está o arquivo .yaml completo!\n# Triggered on push branch source on: push: branches: - source # Name of the workflow - usethis::use_github_actions_badge(\u0026#34;deployblog\u0026#34;) name: deployblog # Set the job, the machine jobs: deployblog: name: Render and deploy blogdown runs-on: ubuntu-18.04 steps: # Cloning your repository from the respective branch that has triggered it - uses: actions/checkout@v2 with: submodules: true fetch-depth: 0 # set-up an R installation in our GHA machine to run our scripts - uses: r-lib/actions/setup-r@v1 # We will also need pandoc to compile our Shiny or RMarkdown report - uses: r-lib/actions/setup-pandoc@v1 # Install R packages - name: Install r packages run: | Rscript -e \u0026#39;install.packages(c(\u0026#34;remotes\u0026#34;, \u0026#34;rmarkdown\u0026#34;))\u0026#39; \\ -e \u0026#39;remotes::install_github(\u0026#34;rstudio/blogdown\u0026#34;)\u0026#39; - name: install hugo # Install Hugo run: Rscript -e \u0026#39;blogdown::install_hugo(extended = TRUE, version = \u0026#34;0.78.2\u0026#34;)\u0026#39; - name: Get themes run: git submodule update --remote - name: Look at files run: ls ./public - name: Render blog run: Rscript -e \u0026#39;blogdown::build_site(local = FALSE)\u0026#39; - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_branch: master publish_dir: ./public Testes Automáticos Eu diria que executar testes manualmente pode ser a tarefa mais demorada apresentada neste post, e é por isso que realizar testes automáticos pode poupar muitas horas de trabalho! Eu sei que testes automáticos são muito específicos; em outras palavras, depende do tipo de teste que você quer realizar. No entanto, podemos ter um ótimo ponto de partida com o pacote usethis!\nPor exemplo, ao executar a função usethis::use_github_action_check_full(), ela criará para você o procedimento padrão de R-CMD-check em uma estrutura de GitHub Actions. O R-CMD-check simulará o uso dos seus códigos nos mais diversos ambientes, como windows, ubuntu e macos, todos rodando também versões diferentes do R. Meu conselho é usar como ponto de partida o .yaml fornecido pela função usethis::use_github_action_check_full() para realizar seus próprios testes automáticos.\nVocê pode encontrar abaixo o arquivo .yaml gerado pela função usethis::use_github_action_check_full():\non: push: branches: - main - master pull_request: branches: - main - master name: R-CMD-check jobs: R-CMD-check: runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.os }} (${{ matrix.config.r }}) strategy: fail-fast: false matrix: config: - {os: macOS-latest, r: \u0026#39;release\u0026#39;} - {os: windows-latest, r: \u0026#39;release\u0026#39;} - {os: windows-latest, r: \u0026#39;3.6\u0026#39;} - {os: ubuntu-18.04, r: \u0026#39;devel\u0026#39;, rspm: \u0026#34;https://packagemanager.rstudio.com/cran/__linux__/bionic/latest\u0026#34;, http-user-agent: \u0026#34;R/4.0.0 (ubuntu-18.04) R (4.0.0 x86_64-pc-linux-gnu x86_64 linux-gnu) on GitHub Actions\u0026#34; } - {os: ubuntu-18.04, r: \u0026#39;release\u0026#39;, rspm: \u0026#34;https://packagemanager.rstudio.com/cran/__linux__/bionic/latest\u0026#34;} - {os: ubuntu-18.04, r: \u0026#39;oldrel\u0026#39;, rspm: \u0026#34;https://packagemanager.rstudio.com/cran/__linux__/bionic/latest\u0026#34;} - {os: ubuntu-18.04, r: \u0026#39;3.5\u0026#39;, rspm: \u0026#34;https://packagemanager.rstudio.com/cran/__linux__/bionic/latest\u0026#34;} - {os: ubuntu-18.04, r: \u0026#39;3.4\u0026#39;, rspm: \u0026#34;https://packagemanager.rstudio.com/cran/__linux__/bionic/latest\u0026#34;} - {os: ubuntu-18.04, r: \u0026#39;3.3\u0026#39;, rspm: \u0026#34;https://packagemanager.rstudio.com/cran/__linux__/bionic/latest\u0026#34;} env: RSPM: ${{ matrix.config.rspm }} GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v2 - uses: r-lib/actions/setup-r@v1 id: install-r with: r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} - uses: r-lib/actions/setup-pandoc@v1 - name: Install pak and query dependencies run: | install.packages(\u0026#34;pak\u0026#34;, repos = \u0026#34;https://r-lib.github.io/p/pak/dev/\u0026#34;) saveRDS(pak::pkg_deps(\u0026#34;local::.\u0026#34;, dependencies = TRUE), \u0026#34;.github/r-depends.rds\u0026#34;) shell: Rscript {0} - name: Restore R package cache uses: actions/cache@v2 with: path: | ${{ env.R_LIBS_USER }} !${{ env.R_LIBS_USER }}/pak key: ${{ matrix.config.os }}-${{ steps.install-r.outputs.installed-r-version }}-1-${{ hashFiles(\u0026#39;.github/r-depends.rds\u0026#39;) }} restore-keys: ${{ matrix.config.os }}-${{ steps.install-r.outputs.installed-r-version }}-1- - name: Install system dependencies if: runner.os == \u0026#39;Linux\u0026#39; run: | pak::local_system_requirements(execute = TRUE) pak::pkg_system_requirements(\u0026#34;rcmdcheck\u0026#34;, execute = TRUE) shell: Rscript {0} - name: Install dependencies run: | pak::local_install_dev_deps(upgrade = TRUE) pak::pkg_install(\u0026#34;rcmdcheck\u0026#34;) shell: Rscript {0} - name: Session info run: | options(width = 100) pkgs \u0026lt;- installed.packages()[, \u0026#34;Package\u0026#34;] sessioninfo::session_info(pkgs, include_base = TRUE) shell: Rscript {0} - name: Check env: _R_CHECK_CRAN_INCOMING_: false run: | options(crayon.enabled = TRUE) rcmdcheck::rcmdcheck(args = c(\u0026#34;--no-manual\u0026#34;, \u0026#34;--as-cran\u0026#34;), error_on = \u0026#34;warning\u0026#34;, check_dir = \u0026#34;check\u0026#34;) shell: Rscript {0} - name: Show testthat output if: always() run: find check -name \u0026#39;testthat.Rout*\u0026#39; -exec cat \u0026#39;{}\u0026#39; \\; || true shell: bash - name: Upload check results if: failure() uses: actions/upload-artifact@main with: name: ${{ matrix.config.os }}-r${{ matrix.config.r }}-results path: check Rotinas Agendadas O GitHub Actions também oferece a opção de agendar rotinas; em outras palavras, você pode definir como triggers qualquer horário específico que quiser. Para isso, o GitHub Actions usa a sintaxe cron, que é a parte difícil (pelo menos para mim, que nunca tinha usado). Primeiro, vamos entender a sintaxe que o GitHub Actions usa para executar as rotinas agendadas!\nA sintaxe cron é dividida em 5 partes (*****):\nA primeira parte define o minuto (0 - 59)\nA segunda parte define a hora (0 - 23)\nA terceira parte define o dia do mês (1 - 31)\nA quarta parte define o mês (1 - 12)\nA quinta parte define o dia da semana (0 - 6)\nObviamente, você não quer executar sua rotina apenas uma vez! Então, você precisa de alguma forma de abstrair algumas das partes; na sintaxe cron, isso é feito usando um asterisco (*). Por exemplo, o ***** significa executar a rotina a cada minuto, todos os dias!\nTenha em mente que os horários do GitHub são baseados em UTC!\nAqui estão alguns exemplos úteis que peguei deste post:\n# Every Monday at 1PM UTC (9AM EST) 0 13 * * 1 # At the end of every day 0 0 * * * # Every 10 minutes */10 * * * * E a sintaxe do .yaml? É muito simples: em vez de usar o \u0026ldquo;on\u0026rdquo; seguido de \u0026ldquo;push\u0026rdquo;, \u0026ldquo;merge\u0026rdquo;, \u0026ldquo;pull_request\u0026rdquo;, etc., você deve escrever \u0026ldquo;schedule\u0026rdquo; e pronto!\non: schedule: - cron: \u0026#39;0 0 * * *\u0026#39; Isso é tudo Espero que alguém ache este tutorial útil. Como sempre, seu feedback é muito bem-vindo; fique à vontade para entrar em contato comigo pelas redes sociais! 😄\n","permalink":"https://adsoncostanzifilho.github.io/pt/blog/github-actions-for-r-users/","summary":"\u003ch2 id=\"motivação\"\u003eMotivação\u003c/h2\u003e\n\u003cp\u003eRecentemente, alguns amigos me apresentaram ao \u003cstrong\u003eGitHub Actions\u003c/strong\u003e e ao quanto ele poderia me ajudar a executar tarefas como: publicar meus \u003cem\u003eShiny Apps\u003c/em\u003e, publicar este \u003cem\u003eBlogdown\u003c/em\u003e, realizar testes automatizados em pacotes, atualizar dados e muito mais. Então, decidi experimentar, e foi tão simples e me poupou tantas horas de trabalho que decidi escrever este post explicando como desenvolvedores R podem fazer bom uso dessa ferramenta incrível.\u003c/p\u003e\n\u003cp\u003ePrimeiro, as referências que usei para começar no \u003cem\u003eGitHub Actions\u003c/em\u003e:\u003c/p\u003e","title":"GitHub Actions para Usuários de R"},{"content":" Visão Geral GitHub: adsoncostanzifilho/CSGo\nO pacote CSGo é um cliente R para acessar a API REST da Steam, especificamente para dados do jogo Counter-Strike Global Offensive (CS Go). Confira o site de documentação da Steam e a página do pacote para mais informações.\nInstalação Para obter a versão atual publicada no CRAN:\ninstall.packages(\u0026#34;CSGo\u0026#34;) Para obter a versão de desenvolvimento atual do GitHub:\n# install.packages(\u0026#34;devtools\u0026#34;) devtools::install_github(\u0026#34;adsoncostanzifilho/CSGo\u0026#34;) Exemplo O primeiro passo para usar o pacote CSGo é ter suas próprias credenciais (API key) para puxar os dados do CSGo da API da Steam. Para mais informações sobre como obter sua própria API Key, execute no seu R vignette(\u0026quot;auth\u0026quot;, package = \u0026quot;CSGo\u0026quot;) ou clique aqui.\nAgora que você já tem sua API Key, você deve conseguir coletar seus próprios dados do CSGo, bem como os dados dos seus amigos. Espero que meu amigo Rodrigo não se importe de brincarmos com os dados dele (ele é o \u0026lsquo;76561198263364899\u0026rsquo;)!\nPrimeiro, vamos coletar as estatísticas de CSGo dele:\nlibrary(CSGo) # to get the statistics of the user 76561198263364899 rodrigo_stats \u0026lt;- get_stats_user(api_key = \u0026#39;your_key\u0026#39;, user_id = \u0026#39;76561198263364899\u0026#39;) Vamos filtrar o data frame obtido por \u0026ldquo;kills\u0026rdquo; e \u0026ldquo;weapon\u0026rdquo; para criar uma análise de kills por tipo de arma.\nlibrary(dplyr) library(stringr) rodrigo_weapon_kill \u0026lt;- rodrigo_stats %\u0026gt;% filter( str_detect(name, \u0026#39;kill\u0026#39;), type == \u0026#39; weapon info\u0026#39; ) %\u0026gt;% arrange(desc(value)) Agora vamos dar uma olhada no gráfico!\nPS: Para deixar o gráfico ainda mais bonito, recomendo obter a fonte \u0026ldquo;Quantico\u0026rdquo; do Google fonts usando o pacote showtext!\nlibrary(ggplot2) library(showtext) ## Loading Google fonts (https://fonts.google.com/) font_add_google(\u0026#34;Quantico\u0026#34;, \u0026#34;quantico\u0026#34;) rodrigo_weapon_kill %\u0026gt;% top_n(n = 10, wt = value) %\u0026gt;% ggplot(aes(x = name_match, y = value, fill = name_match)) + geom_col() + ggtitle(\u0026#34;KILLS BY WEAPON\u0026#34;) + ylab(\u0026#34;Number of Kills\u0026#34;) + xlab(\u0026#34;\u0026#34;) + labs(fill = \u0026#34;Weapon Name\u0026#34;) + theme_csgo(text = element_text(family = \u0026#34;quantico\u0026#34;)) + scale_fill_csgo() Então, essas são as 10 armas com mais kills, mas\u0026hellip; e a eficiência? Será que a ak47 é a arma mais eficiente do Rodrigo? Primeiro, vamos definir \u0026ldquo;eficiência\u0026rdquo;:\nkills_efficiency significa quantos disparos ele precisou para matar (ex.: 32% dos disparos matam)\nhits_efficiency significa quantos disparos acertam o alvo; isso está mais relacionado à habilidade do Rodrigo com cada arma (ex.: 35% dos disparos acertam).\nhits_to_kill significa quantos acertos são necessários para matar; isso está mais relacionado ao poder/eficiência da arma (ex.: 91% dos acertos matam).\nrodrigo_efficiency \u0026lt;- rodrigo_stats %\u0026gt;% filter( name_match %in% c(\u0026#34;ak47\u0026#34;, \u0026#34;aug\u0026#34;, \u0026#34;awp\u0026#34;, \u0026#34;fiveseven\u0026#34;, \u0026#34;hkp2000\u0026#34;, \u0026#34;m4a1\u0026#34;, \u0026#34;mp7\u0026#34;, \u0026#34;p90\u0026#34;, \u0026#34;sg556\u0026#34;, \u0026#34;xm1014\u0026#34;) ) %\u0026gt;% mutate( stat_type = case_when( str_detect(name, \u0026#34;shots\u0026#34;) ~ \u0026#34;shots\u0026#34;, str_detect(name, \u0026#34;hits\u0026#34;) ~ \u0026#34;hits\u0026#34;, str_detect(name, \u0026#34;kills\u0026#34;) ~ \u0026#34;kills\u0026#34; ) ) %\u0026gt;% pivot_wider( names_from = stat_type, id_cols = name_match, values_from = value ) %\u0026gt;% mutate( kills_efficiency = kills/shots*100, hits_efficiency = hits/shots*100, hits_to_kill = kills/hits*100 ) kbl(rodrigo_efficiency) %\u0026gt;% kable_styling() name_match kills shots hits kills_efficiency hits_efficiency hits_to_kill fiveseven 1288 28187 5558 4.569482 19.71831 23.17380 xm1014 5611 205982 42541 2.724024 20.65278 13.18963 p90 3469 133273 20245 2.602928 15.19062 17.13510 awp 2051 6260 2235 32.763578 35.70288 91.76734 ak47 6969 154852 24823 4.500426 16.03014 28.07477 aug 2120 37949 8487 5.586445 22.36423 24.97938 hkp2000 1401 36975 6737 3.789047 18.22042 20.79561 sg556 1243 25091 4567 4.953968 18.20175 27.21699 mp7 1788 52657 10186 3.395560 19.34406 17.55350 m4a1 3526 81126 14687 4.346325 18.10394 24.00763 rodrigo_efficiency %\u0026gt;% top_n(n = 10, wt = kills) %\u0026gt;% ggplot(aes(x = name_match, size = shots)) + geom_point(aes(y = kills_efficiency, color = \u0026#34;Kills Efficiency\u0026#34;)) + geom_point(aes(y = hits_efficiency, color = \u0026#34;Hits Efficiency\u0026#34;)) + geom_point(aes(y = hits_to_kill, color = \u0026#34;Hits to Kill\u0026#34;)) + ggtitle(\u0026#34;WEAPON EFFICIENCY\u0026#34;) + ylab(\u0026#34;Efficiency (%)\u0026#34;) + xlab(\u0026#34;\u0026#34;) + labs(color = \u0026#34;Efficiency Type\u0026#34;, size = \u0026#34;Shots\u0026#34;) + theme_csgo( text = element_text(family = \u0026#34;quantico\u0026#34;), panel.grid.major.x = element_line(size = .1, color = \u0026#34;black\u0026#34;,linetype = 2) ) + scale_color_csgo() Em conclusão, eu aconselharia o Rodrigo a usar a **awp** nos próximos jogos dele, porque essa arma apresentou a melhor eficiência em termos de **shots to kill**, **shots to hit** e **hits to kill**. Mas definitivamente precisamos de mais disparos com essa arma para ver se essa eficiência se mantém... hahahaha ","permalink":"https://adsoncostanzifilho.github.io/pt/blog/csgo-package/","summary":"\u003cscript src=\"https://adsoncostanzifilho.github.io/pt/blog/csgo-package/index_files/kePrint/kePrint.js\"\u003e\u003c/script\u003e\n\u003clink href=\"https://adsoncostanzifilho.github.io/pt/blog/csgo-package/index_files/lightable/lightable.css\" rel=\"stylesheet\" /\u003e\n\u003ch2 id=\"visão-geral\"\u003eVisão Geral\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub:\u003c/strong\u003e \u003ca href=\"https://github.com/adsoncostanzifilho/CSGo\"\u003eadsoncostanzifilho/CSGo\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eO pacote \u003cstrong\u003eCSGo\u003c/strong\u003e é um cliente R para acessar a API REST da Steam, especificamente para dados do jogo Counter-Strike Global Offensive (CS Go). Confira o \u003ca href=\"https://developer.valvesoftware.com/wiki/Steam_Web_API\"\u003esite de documentação da Steam\u003c/a\u003e e a \u003ca href=\"https://adsoncostanzifilho.github.io/CSGo/\"\u003epágina do pacote\u003c/a\u003e para mais informações.\u003c/p\u003e\n\u003ch2 id=\"instalação\"\u003eInstalação\u003c/h2\u003e\n\u003cp\u003ePara obter a versão atual publicada no \u003ca href=\"https://cran.r-project.org/web/packages/CSGo/index.html\"\u003eCRAN\u003c/a\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-r\" data-lang=\"r\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003einstall.packages\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CSGo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePara obter a versão de desenvolvimento atual do \u003ca href=\"https://github.com/adsoncostanzifilho/CSGo\"\u003eGitHub\u003c/a\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-r\" data-lang=\"r\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# install.packages(\u0026#34;devtools\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edevtools\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"nf\"\u003einstall_github\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;adsoncostanzifilho/CSGo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"exemplo\"\u003eExemplo\u003c/h2\u003e\n\u003cp\u003eO primeiro passo para usar o pacote \u003ccode\u003eCSGo\u003c/code\u003e é ter suas próprias credenciais (API key) para puxar os dados do CSGo da API da Steam. Para mais informações sobre como obter sua própria API Key, execute no seu R \u003ccode\u003evignette(\u0026quot;auth\u0026quot;, package = \u0026quot;CSGo\u0026quot;)\u003c/code\u003e ou clique \u003ca href=\"https://cran.r-project.org/web/packages/CSGo/vignettes/auth.html\"\u003eaqui\u003c/a\u003e.\u003c/p\u003e","title":"Pacote CSGo"},{"content":"Motivação Se você está usando um script mais de 3 vezes, está na hora de criar uma função; e se você está usando uma função em 3 projetos diferentes, está na hora de criar um pacote. \u0026ldquo;Ouvi isso de alguém, mas não lembro de quem..\u0026rdquo;\nRecentemente, vivenciei todo o fluxo de criação de um novo pacote R com a ajuda de pacotes incríveis como devtools, usethis, pkgdown e roxygen2. Por isso, decidi escrever sobre isso enquanto ainda lembro de todos os passos necessários para disponibilizar suas funções locais para a comunidade R (CRAN e Github).\nO material que segui para me guiar nesse processo foi o R Packages Book, de Hadley Wickham. É claro que há MUITO MAIS conteúdo no livro dele do que o apresentado aqui, mas talvez este post também possa ajudar alguém de alguma forma.\nFunções Um pacote nada mais é do que um monte de funções juntas no mesmo lugar (compartilhando o mesmo escopo); portanto, a chave principal para ter um bom pacote é também ter boas funções.\nEste post não vai cobrir as diretrizes para criar funções úteis. Para isso, recomendo que você dê uma olhada na seção Functions do Advanced R Book.\nPara facilitar os próximos passos de empacotar suas funções, é importante ter em mente duas coisas:\nPrimeiro, desenvolva suas funções da forma mais genérica possível e sempre inclua comentários explicando os inputs, outputs e pelo menos um exemplo de como usá-la.\nSegundo, lembre-se de todos os pacotes que você usou e, se possível, use sempre a estrutura package::function ao usar funções de outros pacotes dentro das suas.\nPS: Cuidado com aqueles pacotes que sempre usamos, mas geralmente esquecemos porque \u0026ldquo;sempre estiveram lá\u0026rdquo;, como stats e utils.\nO R base é o único que não precisa ser mencionado!\nAgora que nossas funções estão em boa forma, vamos para o desenvolvimento do pacote em si.\nComo começar A primeira coisa a fazer é instalar os pacotes que vão tornar nossa vida mais fácil.\ninstall.packages(c(\u0026#34;devtools\u0026#34;, \u0026#34;usethis\u0026#34;, \u0026#34;pkgdown\u0026#34;, \u0026#34;roxygen2\u0026#34;)) Se você também quiser compartilhar seu pacote no Github, agora é uma boa hora para criar um novo repositório no Github com o nome que você quer dar ao seu pacote, por exemplo \u0026lsquo;mypackage\u0026rsquo;. Clone esse repositório vazio dentro de alguma pasta que você quiser.\nAgora deve ser possível executar o comando devtools::create(\u0026quot;~/path/mypackage\u0026quot;) (informe o caminho do repositório do Github que você acabou de clonar). Essa linha de código criará a estrutura de pastas e arquivos que vamos seguir daqui em diante. Assim que você a executar, uma nova sessão do RStudio em estrutura de projeto R será aberta, colocando você dentro da pasta \u0026ldquo;~/path/mypackage\u0026rdquo;. Se tudo der certo, você deve conseguir ver uma pasta chamada \u0026ldquo;R\u0026rdquo; e os arquivos \u0026ldquo;DESCRIPTION\u0026rdquo; e \u0026ldquo;NAMESPACE\u0026rdquo;.\nPasta R: A pasta R será o lugar onde você deve colocar seus scripts (que contêm suas funções, os arquivos .R). Não existe uma regra sobre como organizar seus scripts dentro dessa pasta; no entanto, eu gosto de seguir a regra de uma função por script. Para mim, ter uma função por script torna o processo de debugging e documentação mais fácil. Mas no fim das contas, a decisão é sua!\nDESCRIPTION: Este arquivo expõe algumas informações importantes sobre o seu pacote. Não é tão desafiador preencher as principais opções deste arquivo; na verdade, o próprio arquivo tem explicações muito boas sobre como preenchê-lo corretamente. Também temos funções como usethis::use_package(\u0026quot;packagename\u0026quot;) para nos ajudar a preencher as outras seções deste arquivo. Falaremos mais sobre isso depois.\nNAMESPACE: Este arquivo traz todas as funções que o usuário do seu pacote poderá usar (todas aquelas funções definidas com @export. Também vamos cobrir mais sobre isso depois). Você não deve editar este arquivo; em vez disso, pode executar devtools::document() para atualizá-lo.\nDocumentação de Funções Agora é hora de documentar suas funções. Este passo é muito importante para tornar seu pacote útil para a comunidade R e para ajudar no uso adequado de cada uma das suas funções. Para isso, vamos usar o pacote roxygen2.\nGraças ao pacote roxygen2, o processo de documentação é mais simples do que nunca. Se você estiver no RStudio, basta abrir o script que contém sua função, posicionar o cursor no início da função e ir em Code menu \u0026gt; Insert Roxygen Skeleton ou ctrl+shift+alt+R. Se tudo der certo, você deve ver uma saída como esta:\n#\u0026#39; Title #\u0026#39; #\u0026#39; @param a #\u0026#39; @param b #\u0026#39; #\u0026#39; @return #\u0026#39; @export #\u0026#39; #\u0026#39; @examples myfunction \u0026lt;- function(a,b) { return(a+b) } Agora é só uma questão de preencher as opções apresentadas com explicações claras sobre o uso da função e dos parâmetros. Além disso, você deve fornecer pelo menos um exemplo de como usá-la e explicar o que o usuário deve esperar em troca.\nÀs vezes, o exemplo que fornecemos só funciona em condições muito específicas. Para esses casos, você deve criar seus exemplos dentro de \\dontrun{}; isso impedirá a execução deles durante a compilação e o check do seu pacote.\nNote que o esqueleto padrão que o roxygen2 nos fornece inclui o #' @export. Isso significa apenas que essa função será exposta ao usuário final; em outras palavras, o usuário deve conseguir executar mypackage::myfunction(). Se por algum motivo você não quiser exportar essa função, basta remover essa linha do seu script.\nFunções definidas sem o #' @export funcionarão internamente sem problemas, mas o usuário final só poderá acessá-las com a estrutura :::, como mypackage:::myfunction().\nNo final desse processo, seu script de função deve ser algo como isto:\n#\u0026#39; My Function #\u0026#39; #\u0026#39; This function provides the sum of two values (the worst example ever, I know!). #\u0026#39; #\u0026#39; @param a the first numeric value #\u0026#39; @param b the second numeric value #\u0026#39; #\u0026#39; @return a numeric value with the sum of a + b #\u0026#39; @export #\u0026#39; #\u0026#39; @examples #\u0026#39; \\dontrun{ #\u0026#39; ## the parameters must be numeric #\u0026#39; #\u0026#39; myfunction(a = 1, b = 1) #\u0026#39; } myfunction \u0026lt;- function(a,b) { return(a+b) } Assim que sua função estiver documentada, você deve executar devtools::document(); isso criará/atualizará a pasta chamada \u0026ldquo;man\u0026rdquo;. Essa pasta armazenará toda a documentação das suas funções. Não se esqueça de executar devtools::document() toda vez que atualizar as descrições das suas funções!\nVocê também pode executar devtools::load_all() para carregar seu pacote na sua sessão atual do R; então você poderá ver como sua documentação fica executando help('mypackage::myfunction') ou ?mypackage::myfunction.\nPacotes Externos É muito improvável que você crie suas funções sem usar NENHUMA dependência (pacotes externos), e isso não é problema nenhum. No entanto, você deve fornecer essa informação ao usuário final de alguma forma; caso contrário, os usuários não conseguirão executar seus códigos como esperado.\nO lugar certo para essa informação é dentro do arquivo DESCRIPTION, na seção \u0026ldquo;Imports\u0026rdquo;. É possível preenchê-la manualmente abrindo o arquivo DESCRIPTION e incluindo todos os pacotes que você usou em suas funções (separados por \u0026ldquo;,\u0026rdquo;) OU você pode usar a função usethis::use_package(\u0026quot;ggplot2\u0026quot;), que cuidará do preenchimento para você.\nA função use_package também oferece opções como a versão mínima do pacote e o tipo de dependência.\nNÃO USE library() OU require() NOS SEUS SCRIPTS R!!!\nOutra possibilidade é incluir apenas uma função de um pacote externo. Isso é muito comum, porque às vezes usamos apenas uma função de um pacote específico e não queremos \u0026ldquo;importar\u0026rdquo; o pacote inteiro, mas somente aquela função que estamos usando. Para isso, você pode incluir @importFrom package_name function_name na documentação da sua função; dessa forma, você conseguirá usar a função sem declarar o pacote de onde ela veio. A partir de então, ela estará disponível como as suas próprias funções mypackage::function_name().\nDigamos que queremos incluir a função beep() do pacote beepr, mas não queremos o beepr inteiro. O script deve ser algo como isto:\n#\u0026#39; My Function #\u0026#39; #\u0026#39; This function provides the sum of two values (the worst example ever, I know!). #\u0026#39; #\u0026#39; @param a the first numeric value #\u0026#39; @param b the second numeric value #\u0026#39; #\u0026#39; @return a numeric value with the sum of a + b #\u0026#39; @export #\u0026#39; #\u0026#39; @importFrom beepr beep #\u0026#39; #\u0026#39; @examples #\u0026#39; \\dontrun{ #\u0026#39; ## the parameters must be numeric #\u0026#39; #\u0026#39; myfunction(a = 1, b = 1) #\u0026#39; } myfunction \u0026lt;- function(a,b) { beep() return(a+b) } A partir de agora, a função beep() deve fazer parte do mypackage. Se você executar devtools::document() e devtools::load_all(), verá que mypackage::beep() vai funcionar.\nTambém é muito comum usar o operador %\u0026gt;% dentro das suas funções. Como sabemos, o operador pipe vem do pacote magrittr, mas não é necessário importar o pacote magrittr inteiro só para usar o %\u0026gt;%. Para isso, você pode executar usethis::use_pipe() e pronto!\nIncluindo Dados E se o meu pacote usar dados externos? Essa é outra possibilidade muito comum, e é muito fácil incluir fontes de dados externas no seu pacote. Graças novamente ao pacote usethis, que nos fornece a função use_data()! Então, para disponibilizar seus dados externos dentro do ambiente das suas funções, você só precisa executar usethis::use_data(mydf), assim:\nmydf \u0026lt;- data.frame( x = rnorm(10,0,1), y = runif(10) ) usethis::use_data(mydf) A partir de agora, você deve conseguir usar o data frame \u0026ldquo;mydf\u0026rdquo; dentro das suas funções sem problemas.\nAssim como as funções, os objetos de dados também devem ser documentados, e a ideia é quase a mesma de documentar suas funções. Primeiro, abra um novo script R e salve-o dentro da pasta R com o nome que quiser (meu conselho é seguir o nome dos seus dados). Depois, você pode seguir a estrutura apresentada abaixo.\n#\u0026#39; Random values #\u0026#39; #\u0026#39; A completely useless data set. #\u0026#39; #\u0026#39; #\u0026#39; @format A data frame with 10 rows and 2 variables: #\u0026#39; \\describe{ #\u0026#39; \\item{x}{10 values from a normal distribution with mean = 0 and sd = 1} #\u0026#39; \\item{y}{10 values from a uniform distribution} #\u0026#39; ... #\u0026#39; } #\u0026#39; @source Created by the author. \u0026#34;mydf\u0026#34; Quando você terminar esse processo, pode executar devtools::document(), e um novo arquivo com o nome dos seus dados será criado dentro da pasta \u0026ldquo;man\u0026rdquo;. Para ver de fato o resultado da sua documentação, execute devtools::load_all(); então você poderá executar help(mypackage::mydf).\nNunca use @export em um conjunto de dados!\nCriando Vignettes As Vignettes são uma parte importante do processo de desenvolvimento de pacotes, porque é o espaço para você, de fato, fazer um \u0026ldquo;passo a passo\u0026rdquo; das capacidades do seu pacote. É importante destacar que você pode criar quantas vignettes quiser!\nComeçar uma nova Vignette é muito simples; você só precisa executar devtools::use_vignette(\u0026quot;intro\u0026quot;). Isso criará uma nova pasta chamada \u0026ldquo;vignettes\u0026rdquo; e, dentro dela, você verá um arquivo chamado \u0026ldquo;intro.Rmd\u0026rdquo;. O \u0026ldquo;intro.Rmd\u0026rdquo; é, no fim das contas, um arquivo Rmarkdown padrão; agora você pode criar o conteúdo dele do jeito que quiser.\nSe você precisar de ajuda com o pacote rmarkdown, meu conselho é dar uma olhada no Rmarkdown Book!\nCriando o README Como a ideia também é disponibilizar o pacote no Github, é quase obrigatório ter uma boa seção de README. Pensando nisso (DE NOVO), o pacote usethis tem a função usethis::use_readme_rmd() para nos ajudar a organizar nosso arquivo README. Agora é só uma questão de abrir o arquivo criado por usethis::use_readme_rmd(), seguir a estrutura e incluir o que você quiser.\nLembre-se de Knit toda vez que mudar algo no arquivo README!\nÉ uma boa ideia dar uma olhada nos repositórios de outros pacotes no Github para se inspirar.\nPara incluir os badges, você pode usar o pacote usethis (ex.: usethis::use_badge(), usethis::use_cran_badge(), etc.).\nSubmissão ao CRAN Agora é hora de atualizar seu pacote no principal repositório do R, a Comprehensive R Archive Network, o CRAN. Todo o trabalho que fizemos até agora é essencial para que seu pacote seja aceito no repositório do CRAN.\nA primeira coisa a fazer é estar de acordo com a CRAN Repository Policy. Aqui você encontrará as regras e diretrizes a seguir para ter seu pacote hospedado pelo CRAN. O próximo passo é preencher o web form.\nAlerta de Spoiler: O web form vai pedir que você forneça seu pacote em um arquivo .tar.gz, e também executará algumas rotinas automáticas para verificar se seu pacote está em boa forma para ser revisado por alguém no CRAN. Antes de \u0026ldquo;buildar\u0026rdquo; seu pacote no formato .tar.gz, vamos ver se nosso pacote passará nos testes automáticos do CRAN. Para simular o procedimento de check do CRAN, você pode executar devtools::check(); isso deve te dar uma boa ideia se seu pacote está pronto para ser hospedado pelo CRAN.\nAgora que você tem um pacote com 0 erros, 0 warnings e 0 notes, é hora de, de fato, buildar o pacote no formato .tar.gz. A forma simples de fazer isso é executando devtools::build() e pronto! Seu pacote agora está pronto para ser submetido ao CRAN! Siga os passos apresentados no web form e fique de olho no seu e-mail (todas as comunicações sobre o status do seu pacote serão por e-mail).\nPara a próxima versão do seu pacote, você pode usar o devtools::release()!\npkgdown Agora que nosso pacote está disponível no Github e no CRAN, podemos facilmente criar sua própria página, como um profissional! Graças ao pkgdown, é muito simples fazer uma página bem bonita para divulgar seu pacote para toda a comunidade R.\nNão vou cobrir toda a funcionalidade do pkgdown; para isso, você pode ver a página do pkgdown!\nComo já temos a estrutura do pacote, a única coisa a fazer para criar a página do seu pacote é:\n# Run to configure package to use pkgdown (once) usethis::use_pkgdown() # Run to build the website (every time you change it) pkgdown::build_site() Eu te disse que essa era a parte mais fácil! Agora vamos hospedar a página no Github Pages!\nPara isso, você deve entrar no repositório do Github do seu pacote e ir em Settings \u0026gt; GitHub Pages:\nAgora você só precisa mudar a Source de onde estará a estrutura da página (para mim, está no master branch e dentro da docs folder).\nPor padrão, o pkgdown criará a pasta docs para você quando você executar pkgdown::build_site()!\nPronto! Basta add, commit, push e a página do seu pacote estará online em: your_github_user.github.io/repository_name.\nIsso é tudo Espero que alguém ache este tutorial útil. Como sempre, seu feedback é muito bem-vindo; fique à vontade para entrar em contato comigo pelas redes sociais! 😄\n","permalink":"https://adsoncostanzifilho.github.io/pt/blog/package-development-tutorial/","summary":"\u003ch2 id=\"motivação\"\u003eMotivação\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSe você está usando um script mais de 3 vezes, está na hora de criar uma função; e se você está usando uma função em 3 projetos diferentes, está na hora de criar um pacote. \u0026ldquo;\u003cem\u003eOuvi isso de alguém, mas não lembro de quem..\u003c/em\u003e\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eRecentemente, vivenciei todo o fluxo de criação de um novo pacote R com a ajuda de pacotes incríveis como \u003ccode\u003edevtools\u003c/code\u003e, \u003ccode\u003eusethis\u003c/code\u003e, \u003ccode\u003epkgdown\u003c/code\u003e e \u003ccode\u003eroxygen2\u003c/code\u003e. Por isso, decidi escrever sobre isso enquanto ainda lembro de todos os passos necessários para disponibilizar suas funções locais para a comunidade R (CRAN e Github).\u003c/p\u003e","title":"Tutorial de Desenvolvimento de Pacotes"},{"content":"Motivação Tive a ideia de escrever um \u0026ldquo;passo a passo\u0026rdquo; sobre o blogdown, primeiro porque foi a minha primeira vez usando o pacote e ainda tenho todos os passos necessários frescos na memória, e segundo porque provavelmente vou precisar ter tudo documentado se um dia decidir renovar este blog. É claro que existem muitos tutoriais ótimos sobre blogdown pela internet (o livro do blogdown, por exemplo), mas talvez alguém possa achar este mais fácil de alguma forma\u0026hellip;\nEste post está dividido em 3 seções: Como começar, Como personalizar e usar, Como publicar. Na primeira seção, você encontrará algumas dicas de como começar o desenvolvimento da sua própria página usando RStudio e blogdown; a segunda seção é sobre as funcionalidades que o blogdown tem para tornar nossa vida mais fácil; e a última é sobre os passos necessários para publicar sua página.\nComo começar A primeira coisa a fazer é install.packages(\u0026quot;blogdown\u0026quot;) para instalar o pacote blogdown. Feito isso, você precisará instalar o Hugo com blogdown::install_hugo(force = TRUE), que é o gerador de sites estáticos que o blogdown usa (o parâmetro force =TRUE atualizará a versão do Hugo que você possa ter instalada).\nAgora que está tudo instalado, podemos começar o desenvolvimento da nossa página. Existem duas formas de começar: usando os Addins do RStudio ou por linhas de comando no console; vamos tentar fazer das duas formas!\nComeçar um novo projeto blogdown pelo RStudio é muito fácil; você só precisa ir no menu File \u0026gt; New Project \u0026gt; New Directory e clicar na opção Website using blogdown.\nNa segunda tela, você precisará escolher um nome para a pasta do projeto, o subdiretório do projeto e o template Hugo (aqui está a parte divertida). O Hugo tem MUITOS templates disponíveis aqui; recomendo fortemente que você experimente alguns deles e escolha aquele que melhor se adequa às suas expectativas.\nDepois de escolher o template Hugo, você só precisa clicar no botão \u0026ldquo;Download\u0026rdquo; e será redirecionado para o repositório do template no Github.\nAgora você só precisa preencher o repositório na opção Hugo theme e clicar em Create Project.\nSe você preferir usar o console (estilo old school), basta executar a função blogdown::new_site(theme = \u0026quot;devcows/hugo-universal-theme\u0026quot;) e preencher o parâmetro theme.\nEsta página foi desenvolvida usando o Universal Theme\nComo personalizar e usar Se tudo deu certo, o RStudio deve mostrar uma prévia do seu site na aba Viewer e deve abrir um script config.toml. Dentro da pasta do seu projeto, o blogdown criará MUITAS pastas; falaremos sobre isso mais adiante.\nO script config.toml te dá a opção de personalizar seu site sem alterar nada no CSS, HTML ou JavaScript (é claro que, se você quiser mudar seu site profundamente, você precisa ter pelo menos algum conhecimento de CSS). Neste arquivo, você encontrará opções para mudar o nome do seu site, imagens, algumas cores, etc. Eu encorajo você a modificar essas opções e ver os resultados: quando você salva o arquivo, a aba Viewer atualiza seu site automaticamente, então você poderá ver suas mudanças.\nQuase todos os templates têm um arquivo README com algumas explicações sobre as funcionalidades que o template possui; isso ajudará você a usar o tema corretamente (você pode encontrá-lo dentro da pasta themes).\nAs pastas 😖 Eu sei que essa estrutura de pastas pode ser muito confusa no começo; esse é um dos motivos pelos quais decidi criar este post (porque não sei se vou lembrar de tudo isso na semana que vem).\npasta content A pasta content é onde todos os seus posts e abas devem ser armazenados; toda vez que você escreve um novo post, essa pasta é atualizada com o conteúdo dele. Falaremos mais sobre novos posts mais adiante.\npasta static A pasta static é onde você atualizará todas as imagens que quiser usar na sua página. Você deve substituir as imagens existentes nessa pasta pelas suas próprias imagens.\nÀs vezes, é necessário limpar o cache do seu navegador para ver a nova imagem que você acabou de mudar e reiniciar o R pelo menu do RStudio Session \u0026gt; Restart R para vê-la na aba Viewer.\npasta themes A pasta themes é a pasta principal do seu template; aqui você pode encontrar o arquivo README, CSS, JS, HTML e, em alguns temas, uma pasta Example. É para lá que você deve ir se quiser mudar algumas estruturas da sua página.\nNovos posts Você provavelmente quer criar novos posts na sua página sem dor de cabeça. Pensando nisso, Yihui Xie, o responsável pelo pacote blogdown, criou a função blogdown::new_post() (ou pelo RStudio em Addins \u0026gt; New Post).\nAntes de começar a usar, há outra coisa que podemos fazer para tornar o processo de criação de \u0026ldquo;novo post\u0026rdquo; ainda mais fácil. Vamos mudar algumas opções globais! Para isso, precisamos modificar e salvar o arquivo .Rprofile, que é um script executado toda vez que sua sessão do R é iniciada. Aqui está o comando para abrir esse script: file.edit('.Rprofile'). Agora podemos definir algumas opções padrão para nossos novos posts (dê uma olhada aqui para ver as outras opções possíveis).\n# default extension and default author options(blogdown.ext = \u0026#39;.Rmd\u0026#39;, blogdown.author = \u0026#39;Your Name\u0026#39;) No meu caso, escolhi a extensão .Rmd porque me sinto mais confortável escrevendo com ela, mas você pode, por exemplo, escolher .md, se preferir. Agora que configuramos tudo do jeito que queremos, vamos começar a parte de escrever o post 😰. Quando você inicia um New Post, um arquivo .Rmd padrão é criado; agora é só escrever o seu conteúdo!\nNão é necessário Knit no arquivo; o blogdown renderiza o post automaticamente quando você salva o arquivo, e você pode acompanhar as atualizações na aba Viewer do RStudio.\nComo publicar Agora que está tudo pronto na nossa página, é hora de publicá-la. Vou mostrar como fazer isso usando o Github Pages, mas é claro que existem muitas outras opções (eu só acho que essa é a mais fácil\u0026hellip;). Para publicar nossa página, precisamos apenas destes 6 passos:\nCriar uma conta no Github\nCriar um novo repositório\nO nome do seu repositório DEVE SER seu usuário do Github + .github.io (USERNAME.github.io)\nClonar este repositório DENTRO da pasta do seu projeto\nExecutar a função blogdown::build_site()\nAntes de executar essa função, você deve mudar a opção publishDir dentro do config.toml para a pasta USERNAME.github.io (que é o seu repositório do Github).\npublishDir = \u0026#34;USERNAME.github.io\u0026#34; PS: Se o seu config.toml não tiver essa opção, você pode criá-la por conta própria.\nEnviar as mudanças para o seu repositório do Github Na aba Terminal, entre na pasta USERNAME.github.io usando cd. Dentro dessa pasta, você só precisa fazer: git add, git commit -m \u0026quot;first deploy my blog\u0026quot;, git push.\nSua página estará online em USERNAME.github.io Isso é tudo O pacote blogdown tem MUITO MAIS funcionalidades do que as apresentadas neste post. Para aprender mais sobre ele, recomendo que você leia o livro do blogdown.\nEspero que alguém ache este tutorial útil. Como sempre, seu feedback é muito bem-vindo; fique à vontade para entrar em contato comigo pelas redes sociais! 😄\n","permalink":"https://adsoncostanzifilho.github.io/pt/blog/blogdown-tutorial/","summary":"\u003ch2 id=\"motivação\"\u003eMotivação\u003c/h2\u003e\n\u003cp\u003eTive a ideia de escrever um \u0026ldquo;passo a passo\u0026rdquo; sobre o blogdown, primeiro porque foi a minha primeira vez usando o pacote e ainda tenho todos os passos necessários frescos na memória, e segundo porque provavelmente vou precisar ter tudo documentado se um dia decidir renovar este blog. É claro que existem muitos tutoriais ótimos sobre blogdown pela internet (o \u003ca href=\"https://bookdown.org/yihui/blogdown/\"\u003elivro do blogdown\u003c/a\u003e, por exemplo), mas talvez alguém possa achar este mais fácil de alguma forma\u0026hellip;\u003c/p\u003e","title":"Tutorial de Blogdown"},{"content":"Visão Geral GitHub: adsoncostanzifilho/TextMining\nA Ferramenta de Mineração de Texto é uma interface desenvolvida em R usando principalmente os pacotes shiny, tidytext e rtweet. A ideia dessa interface é permitir que você faça suas próprias análises de texto usando dados ao vivo do Twitter.\nA ferramenta está online no repositório shinyapps no endereço https://adsoncostanzi.shinyapps.io/TextMining/.\nComo essa interface funciona? A interface é dividida em 5 abas apresentadas no menu à esquerda: Home , Search , Word Cloud , Sentiment Analysis e Topic Modeling .\nA primeira coisa que você precisa fazer para usar a página inteira é coletar alguns dados do Twitter. Para isso, basta ir até a aba Search e seguir os passos apresentados lá!\nDepois de concluir a etapa de \u0026ldquo;coleta de dados\u0026rdquo; na aba Search, você poderá usar as outras abas disponíveis no menu à esquerda.\nPS: Você encontrará pela interface alguns sinais de ?; ao clicar em um deles, uma janela pop-up com explicações será aberta para te guiar sobre como usar aquela opção corretamente.\n","permalink":"https://adsoncostanzifilho.github.io/pt/blog/text-mining-tool/","summary":"\u003ch2 id=\"visão-geral\"\u003eVisão Geral\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub:\u003c/strong\u003e \u003ca href=\"https://github.com/adsoncostanzifilho/TextMining\"\u003eadsoncostanzifilho/TextMining\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eA \u003cstrong\u003eFerramenta de Mineração de Texto\u003c/strong\u003e é uma interface desenvolvida em R usando principalmente os pacotes shiny, tidytext e rtweet. A ideia dessa interface é permitir que você faça suas próprias análises de texto usando dados ao vivo do Twitter.\u003c/p\u003e\n\u003cp\u003eA ferramenta está online no repositório shinyapps no endereço \u003ca href=\"https://adsoncostanzi.shinyapps.io/TextMining/\"\u003ehttps://adsoncostanzi.shinyapps.io/TextMining/\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"como-essa-interface-funciona\"\u003eComo essa interface funciona?\u003c/h2\u003e\n\u003cp\u003eA interface é dividida em 5 abas apresentadas no menu à esquerda: Home , Search , Word Cloud , Sentiment Analysis e Topic Modeling .\u003c/p\u003e","title":"Ferramenta de Mineração de Texto"},{"content":"Visão Geral GitHub: adsoncostanzifilho/soothsayeR\nO SoothsayeR é uma interface baseada na velha brincadeira chamada \u0026lsquo;Pedro responde\u0026rsquo;..\nA ideia do jogo é brincar com seus amigos fazendo perguntas cujas respostas você já sabe, e fazê-los acreditar que é o R quem está respondendo…\nO aplicativo demonstra como é fácil integrar o Shiny com Javascript por meio da biblioteca shinyjs.\nA ferramenta está online no repositório shinyapps no endereço https://adsoncostanzi.shinyapps.io/soothsayeR/.\nComo jogar com o soothsayeR? Você só precisa pressionar o ponto (.) no teclado na sessão de perguntas e então escrever a resposta secretamente. Quando você pressiona o ponto no campo de texto da pergunta, tudo o que você digitar será mascarado, para que você possa colocar a resposta sem que ninguém perceba.\nEntão, quando terminar de digitar a resposta, você só precisa pressionar o ponto novamente e completar a frase da pergunta da maneira que quiser.\nExemplo Você conta para um amigo ao seu lado que o R pode responder qualquer pergunta. Para provar, você diz que vai perguntar ao R a cor da camisa que ele está usando.\nNa sessão de perguntas você vai escrever \u0026lsquo;.red.ase answer\u0026rsquo;, mas apenas \u0026lsquo;R please answer\u0026rsquo; será exibido na tela. No próximo passo, você vai escrever a seguinte pergunta: \u0026lsquo;Qual é a cor da camiseta da pessoa ao meu lado?\u0026rsquo;.\nFeito isso, basta pressionar o botão \u0026lsquo;Guess\u0026rsquo; e a resposta red aparecerá!\n","permalink":"https://adsoncostanzifilho.github.io/pt/blog/soothsayer/","summary":"\u003ch2 id=\"visão-geral\"\u003eVisão Geral\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub:\u003c/strong\u003e \u003ca href=\"https://github.com/adsoncostanzifilho/soothsayeR\"\u003eadsoncostanzifilho/soothsayeR\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eO \u003cstrong\u003eSoothsayeR\u003c/strong\u003e é uma interface baseada na velha brincadeira chamada \u0026lsquo;Pedro responde\u0026rsquo;..\u003c/p\u003e\n\u003cp\u003eA ideia do jogo é brincar com seus amigos fazendo perguntas cujas respostas você já sabe, e fazê-los acreditar que é o R quem está respondendo…\u003c/p\u003e\n\u003cp\u003eO aplicativo demonstra como é fácil integrar o \u003cstrong\u003eShiny\u003c/strong\u003e com \u003cstrong\u003eJavascript\u003c/strong\u003e por meio da biblioteca \u003cstrong\u003eshinyjs\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eA ferramenta está online no repositório shinyapps no endereço \u003ca href=\"https://adsoncostanzi.shinyapps.io/soothsayeR/\"\u003ehttps://adsoncostanzi.shinyapps.io/soothsayeR/\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"como-jogar-com-o-soothsayer\"\u003eComo jogar com o soothsayeR?\u003c/h2\u003e\n\u003cp\u003eVocê só precisa pressionar o ponto (.) no teclado na sessão de perguntas e então escrever a resposta secretamente. Quando você pressiona o ponto no campo de texto da pergunta, tudo o que você digitar será mascarado, para que você possa colocar a resposta sem que ninguém perceba.\u003c/p\u003e","title":"soothsayeR"},{"content":"Adson Costanzi Filho Cientista de Dados na Laboratoria Sou estatístico formado pela Universidade Federal do Rio Grande do Sul (UFRGS), Brasil, com cerca de 7 anos de experiência em ambientes de ciência de dados. Meu trabalho é focado principalmente em desenvolvimento de modelos, mineração de texto, análise de sentimentos, visualização de dados e criação de relatórios.\nAtualmente sou Cientista de Dados na Laboratoria, onde sou responsável pela gestão do pipeline de dados, usando automação para agilizar a geração de relatórios gerenciais e dashboards. Meu papel envolve o desenho de experimentos e a implementação de modelos estatísticos e algoritmos de machine learning para melhorar a experiência das estudantes e impulsionar iniciativas de melhoria do negócio. Trabalho diariamente com R, Python, SQL, Docker e Google Cloud.\nSou um membro ativo da comunidade R e o desenvolvedor/mantenedor do pacote CSGo, hospedado no CRAN, que extrai dados da API da Steam para o Counter-Strike: Global Offensive. Você pode encontrar mais projetos dos quais participo no meu GitHub.\nExperiência Cientista de Dados — Laboratoria, Remoto (out. 2021 – atual) Cientista de Dados Sênior — Evalueserve, Viña del Mar, Chile (jan. 2021 – out. 2021) Cientista de Dados — Evalueserve, Viña del Mar, Chile (set. 2019 – jan. 2021) Especialista em Modelagem de Crédito — Renner S.A., Porto Alegre, Brasil (jun. 2019 – ago. 2019) Analista de Ciência de Dados II — Agibank, Porto Alegre, Brasil (dez. 2018 – jun. 2019) Analista de Ciência de Dados I — Agibank, Porto Alegre, Brasil (jul. 2018 – dez. 2018) Analista de Prevenção a Fraudes — Agibank, Porto Alegre, Brasil (ago. 2017 – jul. 2018) Assistente de Ciência de Dados — British American Tobacco, Porto Alegre, Brasil (ago. 2016 – ago. 2017) Estagiário de Ciência de Dados — British American Tobacco, Porto Alegre, Brasil (nov. 2015 – ago. 2016) Formação Bacharelado em Estatística — Universidade Federal do Rio Grande do Sul (UFRGS), Porto Alegre, Brasil (2012 – 2017) Intercâmbio em Estatística — Universidad de Valladolid, Valladolid, Espanha (2014 – 2015) Habilidades técnicas R · Python · SQL · Git · CSS · SAS · Office · VBA · JavaScript (iniciante)\nIdiomas Português (nativo) · Inglês (avançado) · Espanhol (avançado)\nContato Sinta-se à vontade para entrar em contato pelo e-mail adsoncostanzi32@gmail.com ou pelas minhas redes sociais. Você também pode baixar meu currículo completo (PDF).\n","permalink":"https://adsoncostanzifilho.github.io/pt/about/","summary":"\u003ch2 id=\"adson-costanzi-filho\"\u003eAdson Costanzi Filho\u003c/h2\u003e\n\u003ch4 id=\"cientista-de-dados-na-laboratoria\"\u003eCientista de Dados na \u003ca href=\"https://www.laboratoria.la/\"\u003eLaboratoria\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eSou estatístico formado pela Universidade Federal do Rio Grande do Sul (UFRGS), Brasil, com cerca de 7 anos de experiência em ambientes de ciência de dados. Meu trabalho é focado principalmente em \u003cstrong\u003edesenvolvimento de modelos\u003c/strong\u003e, \u003cstrong\u003emineração de texto\u003c/strong\u003e, \u003cstrong\u003eanálise de sentimentos\u003c/strong\u003e, \u003cstrong\u003evisualização de dados\u003c/strong\u003e e \u003cstrong\u003ecriação de relatórios\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eAtualmente sou Cientista de Dados na \u003ca href=\"https://www.laboratoria.la/\"\u003eLaboratoria\u003c/a\u003e, onde sou responsável pela gestão do pipeline de dados, usando automação para agilizar a geração de relatórios gerenciais e dashboards. Meu papel envolve o desenho de experimentos e a implementação de modelos estatísticos e algoritmos de machine learning para melhorar a experiência das estudantes e impulsionar iniciativas de melhoria do negócio. Trabalho diariamente com \u003cstrong\u003eR\u003c/strong\u003e, \u003cstrong\u003ePython\u003c/strong\u003e, \u003cstrong\u003eSQL\u003c/strong\u003e, \u003cstrong\u003eDocker\u003c/strong\u003e e \u003cstrong\u003eGoogle Cloud\u003c/strong\u003e.\u003c/p\u003e","title":"Sobre"}]