::p_load(
pacman# Interações de arquivo / diretório
fs, # Importar / Exportar
rio, # Caminhos de arquivo respectivos
here, # Gerenciamento e visualização de dados tidyverse)
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.
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”).
::dir_tree(path = here("data"), recurse = TRUE) fs
C:/Users/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917c622841b8/epiRhandbook_eng/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_example_data
│ ├── covid_example_data.xlsx
│ └── covid_shapefile
│ ├── FultonCountyZipCodes.cpg
│ ├── FultonCountyZipCodes.dbf
│ ├── FultonCountyZipCodes.prj
│ ├── FultonCountyZipCodes.sbn
│ ├── FultonCountyZipCodes.sbx
│ ├── FultonCountyZipCodes.shp
│ ├── FultonCountyZipCodes.shp.xml
│ └── FultonCountyZipCodes.shx
├── 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/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917c622841b8/epiRhandbook_eng/data/gis/population/sle_admpop_adm3_2020.csv
C:/Users/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917c622841b8/epiRhandbook_eng/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] "2024-09-18 22:47:21 +07"
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] FALSE
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/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917c622841b8/epiRhandbook_eng/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/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917c622841b8/epiRhandbook_eng/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:
<- c(
scripts_to_run "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”.
45.9 Recursos
https://cran.r-project.org/web/packages/fs/vignettes/function-comparisons.html