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”).
## 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).
## [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.
45.6 Deletar
Objetos R
Use rm()
do R base para remover um objeto R.
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).
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”.