× Você precisa de ajuda para aprender R? Inscreva-se no curso de introdução ao R da Applied Epi, experimente nossos tutoriais gratuitos sobre o R, publique em nosso fórum de perguntas e respostas, ou solicite nosso suporte ao R.

45 Interações de diretório

Nesta página, cobrimos cenários comuns onde você cria, interage, salva e importa com diretórios (pastas).

45.1 Preparação

Pacote fs

O fs é um pacote do tidyverse que facilita as interações de diretório, melhorando algumas das funções do R base. Nas seções a seguir, usaremos frequentemente as funções do fs.

pacman::p_load(
  fs,             # Interações de arquivo / diretório
  rio,            # Importar / Exportar
  here,           # Caminhos de arquivo respectivos
  tidyverse)      # Gerenciamento e visualização de dados

Imprimir diretório como uma árvore de dendrograma

Use a função dir_tree() do fs.

Forneça o caminho da pasta do arquivo para path = e decida se deseja mostrar apenas um nível (recurse = FALSE) ou todos os arquivos em todos os subníveis (recurse = TRUE). Abaixo, usamos here() como uma abreviação para o projeto R e especificamos sua subpasta “data” (dados), que contém todos os dados usados para este manual de R. Nós o configuramos para exibir todos os arquivos na pasta supra citada e suas subpastas (por exemplo, “cache”, “epidemic models”, “population”, “shp”, and “weather”).

fs::dir_tree(path = here("data"), recurse = TRUE)
## C:/Users/neale/Documents/Applied Epi/repos/epirhandbook_pt/data
## ├── africa_countries.geo.json
## ├── cache
## │   └── epidemic_models
## │       ├── 2015-04-30
## │       │   ├── estimated_reported_cases_samples.rds
## │       │   ├── estimate_samples.rds
## │       │   ├── latest_date.rds
## │       │   ├── reported_cases.rds
## │       │   ├── summarised_estimated_reported_cases.rds
## │       │   ├── summarised_estimates.rds
## │       │   └── summary.rds
## │       ├── epinow_res.rds
## │       ├── epinow_res_small.rds
## │       ├── generation_time.rds
## │       └── incubation_period.rds
## ├── case_linelists
## │   ├── cleaning_dict.csv
## │   ├── fluH7N9_China_2013.csv
## │   ├── linelist_cleaned.rds
## │   ├── linelist_cleaned.xlsx
## │   └── linelist_raw.xlsx
## ├── country_demographics.csv
## ├── covid_incidence.csv
## ├── covid_incidence_map.R
## ├── district_count_data.xlsx
## ├── example
## │   ├── Central Hospital.csv
## │   ├── district_weekly_count_data.xlsx
## │   ├── fluH7N9_China_2013.csv
## │   ├── hospital_linelists.xlsx
## │   ├── linelists
## │   │   ├── 20201007linelist.csv
## │   │   ├── case_linelist20201006.csv
## │   │   ├── case_linelist_2020-10-02.csv
## │   │   ├── case_linelist_2020-10-03.csv
## │   │   ├── case_linelist_2020-10-04.csv
## │   │   ├── case_linelist_2020-10-05.csv
## │   │   └── case_linelist_2020-10-08.xlsx
## │   ├── Military Hospital.csv
## │   ├── Missing.csv
## │   ├── Other.csv
## │   ├── Port Hospital.csv
## │   └── St. Mark's Maternity Hospital (SMMH).csv
## ├── facility_count_data.rds
## ├── flexdashboard
## │   ├── outbreak_dashboard.html
## │   ├── outbreak_dashboard.Rmd
## │   ├── outbreak_dashboard_shiny.Rmd
## │   ├── outbreak_dashboard_test.html
## │   └── outbreak_dashboard_test.Rmd
## ├── fluH7N9_China_2013.csv
## ├── gis
## │   ├── africa_countries.geo.json
## │   ├── covid_incidence.csv
## │   ├── covid_incidence_map.R
## │   ├── linelist_cleaned_with_adm3.rds
## │   ├── population
## │   │   ├── sle_admpop_adm3_2020.csv
## │   │   └── sle_population_statistics_sierraleone_2020.xlsx
## │   └── shp
## │       ├── README.txt
## │       ├── sle_adm3.CPG
## │       ├── sle_adm3.dbf
## │       ├── sle_adm3.prj
## │       ├── sle_adm3.sbn
## │       ├── sle_adm3.sbx
## │       ├── sle_adm3.shp
## │       ├── sle_adm3.shp.xml
## │       ├── sle_adm3.shx
## │       ├── sle_hf.CPG
## │       ├── sle_hf.dbf
## │       ├── sle_hf.prj
## │       ├── sle_hf.sbn
## │       ├── sle_hf.sbx
## │       ├── sle_hf.shp
## │       └── sle_hf.shx
## ├── godata
## │   ├── cases_clean.rds
## │   ├── contacts_clean.rds
## │   ├── followups_clean.rds
## │   └── relationships_clean.rds
## ├── likert_data.csv
## ├── linelist_cleaned.rds
## ├── linelist_cleaned.xlsx
## ├── linelist_raw.xlsx
## ├── make_evd_dataset-DESKTOP-JIEUMMI.R
## ├── make_evd_dataset.R
## ├── malaria_app
## │   ├── app.R
## │   ├── data
## │   │   └── facility_count_data.rds
## │   ├── funcs
## │   │   └── plot_epicurve.R
## │   ├── global.R
## │   ├── malaria_app.Rproj
## │   ├── server.R
## │   └── ui.R
## ├── malaria_facility_count_data.rds
## ├── phylo
## │   ├── sample_data_Shigella_tree.csv
## │   ├── Shigella_subtree_2.nwk
## │   ├── Shigella_subtree_2.txt
## │   └── Shigella_tree.txt
## ├── rmarkdown
## │   ├── outbreak_report.docx
## │   ├── outbreak_report.html
## │   ├── outbreak_report.pdf
## │   ├── outbreak_report.pptx
## │   ├── outbreak_report.Rmd
## │   ├── report_tabbed_example.html
## │   └── report_tabbed_example.Rmd
## ├── standardization
## │   ├── country_demographics.csv
## │   ├── country_demographics_2.csv
## │   ├── deaths_countryA.csv
## │   ├── deaths_countryB.csv
## │   └── world_standard_population_by_sex.csv
## ├── surveys
## │   ├── population.xlsx
## │   ├── survey_data.xlsx
## │   └── survey_dict.xlsx
## └── time_series
##     ├── campylobacter_germany.xlsx
##     └── weather
##         ├── germany_weather2002.nc
##         ├── germany_weather2003.nc
##         ├── germany_weather2004.nc
##         ├── germany_weather2005.nc
##         ├── germany_weather2006.nc
##         ├── germany_weather2007.nc
##         ├── germany_weather2008.nc
##         ├── germany_weather2009.nc
##         ├── germany_weather2010.nc
##         └── germany_weather2011.nc

45.2 Listar arquivos em um diretório

Para listar apenas os nomes dos arquivos em um diretório, você pode usar dir() do R base. Por exemplo, este comando lista os nomes dos arquivos na subpasta “população” da pasta “dados” em um projeto R. O caminho de arquivo respectivo é fornecido usando here() (sobre o qual você pode ler mais na página Importar e exportar).

# Nomes de arquivos
dir(here("data", "gis", "population"))
## [1] "sle_admpop_adm3_2020.csv"                       
## [2] "sle_population_statistics_sierraleone_2020.xlsx"

Para listar os caminhos completos dos arquivos do diretório, você pode usar dir_ls() de fs. Uma alternativa é list.files() do R base .

# Caminhos de arquivos
dir_ls(here("data", "gis", "population"))
## C:/Users/neale/Documents/Applied Epi/repos/epirhandbook_pt/data/gis/population/sle_admpop_adm3_2020.csv
## C:/Users/neale/Documents/Applied Epi/repos/epirhandbook_pt/data/gis/population/sle_population_statistics_sierraleone_2020.xlsx

Para obter todas as informações de metadados sobre cada arquivo em um diretório (por exemplo, caminho, data de modificação, etc.), você pode usar dir_info() de fs.

Isso pode ser particularmente útil se você deseja extrair a hora da última modificação do arquivo, por exemplo, se deseja importar a versão mais recente. Para obter um exemplo disso, consulte a página Importar e exportar.

# Informações do arquivo
dir_info(here("data", "gis", "population"))

Aqui está o dataframe que retorna. Role para a direita para ver todas as colunas.

45.3 Informações do arquivo

Para extrair informações de metadados sobre um arquivo específico, você pode usar file_info() de fs (ou file.info() do R base).

file_info(here("data", "case_linelists", "linelist_cleaned.rds"))

Aqui usamos o $ para indexar o resultado e retornar apenas o valor modify_time.

file_info(here("data", "case_linelists", "linelist_cleaned.rds"))$modification_time
## [1] "2023-10-24 07:56:43 CEST"

45.4 Verifique se existe

Objetos R

Você pode usar exists() do R base para verificar se um objeto existe dentro do R (forneça o nome do objeto entre aspas).

exists("linelist")
## [1] TRUE

Observe que alguns pacotes do R base usam nomes de objetos genéricos como “data” (que significa “dados” em inglês) nos bastidores, que aparecerão como TRUE a menos que inherit = FALSE seja especificado. Este é um dos motivos para não nomear o conjunto de dados como “data”.

exists("data")
## [1] TRUE
exists("data", inherit = FALSE)
## [1] FALSE

Se você está escrevendo uma função, deve usar missing() do R base para verificar se um argumento está presente ou não, ao invés de exists().

Diretórios

Para verificar se existe um diretório, forneça o caminho do arquivo (e nome do arquivo) para is_dir() de fs. Role para a direita para ver que retorna TRUE.

is_dir(here("data"))
## C:/Users/neale/Documents/Applied Epi/repos/epirhandbook_pt/data 
##                                                            TRUE

Uma alternativa é file.exists() do R base.

Arquivos

Para verificar se um arquivo específico existe, use is_file() de fs. Role para a direita para ver que retorna TRUE.

is_file(here("data", "case_linelists", "linelist_cleaned.rds"))
## C:/Users/neale/Documents/Applied Epi/repos/epirhandbook_pt/data/case_linelists/linelist_cleaned.rds 
##                                                                                                TRUE

Uma alternativa no R base é file.exists().

45.5 Criar

Diretórios

Para criar um novo diretório (pasta), você pode usar dir_create() de fs. Se o diretório já existir, ele não será criado novamente e não será retornado nenhum erro.

dir_create(here("data", "test"))

Uma alternativa é dir.create() do R base, que mostrará um erro se o diretório já existir. Em contraste, dir_create() neste cenário será silencioso.

Arquivos

Você pode criar um arquivo (vazio) com file_create() de fs. Se o arquivo já existir, ele não será criado novamente ou alterado.

file_create(here("data", "test.rds"))

file.create() é uma alternativa no R base. Mas se o arquivo já existe, esta opção irá truncá-lo. Se você usar file_create() o arquivo não será alterado.

Criar se não existir

EM CONSTRUÇÃO

45.6 Deletar

Objetos R

Use rm() do R base para remover um objeto R.

Diretórios

Use dir_delete() de fs.

Arquivos

Você pode excluir arquivos com file_delete() de fs.

45.7 Executando outros arquivos

source()

Para executar um script R a partir de outro script R, você pode usar o comando source() (do R base).

source(here("scripts", "cleaning_scripts", "clean_testing_data.R"))

Isso é equivalente a visualizar o script R acima e clicar no botão “Source” (Fonte) no canto superior direito do script. Isso executará o script, mas silenciosamente (sem saída para o console do R), a menos que seja especificada esta intenção. Veja a página [Console interativo] para exemplos de uso da source() para interagir com um usuário através do console R no modo pergunta e resposta.

render()

render() é uma variação de source() mais frequentemente usada para scripts R markdown. Você fornece o input = que é o arquivo Rmarkdown (.Rmd), e também o output_format = (normalmente “html_document”, “pdf_document”, “word_document”, ““)

Consulte a página Relatórios com R Markdown para obter mais detalhes. Veja também a documentação para render() aqui ou inserindo ?render.

Executar arquivos em um diretório

Você pode criar um for loop e usá-lo em source() para todos os arquivos em um diretório, identificado com dir(). with dir().

for(script in dir(here("scripts"), pattern = ".R$")) {   # Para cada nome de script na pasta "scripts" do Projeto R (com extensão .R)
  source(here("scripts", script))                        # Fonte dos arquivos com nomes correspondentes aos encontrados na pasta de scripts
}

Se você deseja apenas executar determinados scripts, pode identificá-los pelos nomes da seguinte forma:

scripts_to_run <- c(
     "epicurves.R",
     "demographic_tables.R",
     "survival_curves.R"
)

for(script in scripts_to_run) {
  source(here("scripts", script))
}

Aqui está uma comparação das funções de fs e R base.

Importar arquivos em um diretório

Consulte a página Importar e exportar para importar e exportar arquivos individuais.

Consulte também a página Importar e exportar para métodos que importem automaticamente o arquivo mais recente, com base em uma data no nome do arquivo ou nos metadados do arquivo.

Veja na página Iteração, loops e listas um exemplo com o pacote purrr demonstrando:

  • Dividir um dataframe e salvá-lo como vários arquivos CSV
  • Dividir um dataframe e salvar cada parte em uma planilha separada dentro de uma pasta de trabalho do Excel
  • Importar vários arquivos CSV e combiná-los em um dataframe
  • Importar uma pasta de trabalho do Excel com várias planilhas e combiná-las em um único dataframe

45.8 R base

Veja abaixo as funções list.files() e dir(), que realizam a mesma operação de listar arquivos dentro de um diretório especificado. Você pode especificar ignore.case = ou um padrão específico para procurar.

list.files(path = here("data"))

list.files(path = here("data"), pattern = ".csv")
# dir(path = here("data"), pattern = ".csv")

list.files(path = here("data"), pattern = "evd", ignore.case = TRUE)

Se um arquivo estiver “aberto” no momento, ele será exibido em sua pasta com um til na frente, como “~$hospital_linelists.xlsx”.