Last updated: 2025-10-03
Checks: 6 1
Knit directory: cassavabaseembrapa/
This reproducible R Markdown analysis was created with workflowr (version 1.7.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.
The R Markdown is untracked by Git. To know which version of the R
Markdown file created these results, you’ll want to first commit it to
the Git repo. If you’re still working on the analysis, you can ignore
this warning. When you’re finished, you can run
wflow_publish to commit the R Markdown file and build the
HTML.
Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.
The command set.seed(20220609) was run prior to running
the code in the R Markdown file. Setting a seed ensures that any results
that rely on randomness, e.g. subsampling or permutations, are
reproducible.
Great job! Recording the operating system, R version, and package versions is critical for reproducibility.
Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.
Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.
Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.
The results in this page were generated with repository version 8b063f3. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.
Note that you need to be careful to ensure that all relevant files for
the analysis have been committed to Git prior to generating the results
(you can use wflow_publish or
wflow_git_commit). workflowr only checks the R Markdown
file, but you know if there are other scripts or data files that it
depends on. Below is the status of the Git repository when the results
were generated:
Ignored files:
Ignored: .Rproj.user/
Untracked files:
Untracked: README.html
Untracked: analysis/CassavaBase_EMBRAPA.Rmd
Untracked: data/Dados híbridos_ATUALIZADO2.xlsx
Untracked: data/Dados_hibridos2.xlsx
Untracked: output/acess_pheno.xls
Untracked: output/resumo_acess.xlsx
Unstaged changes:
Modified: analysis/about.Rmd
Modified: analysis/index.Rmd
Modified: analysis/license.Rmd
Modified: data/Trials-in-cassava-base.xlsx
Modified: data/locais e siglas dos experimentos 2021.xlsx
Modified: data/sinonimous.xlsx
Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.
There are no past versions. Publish this analysis with
wflow_publish() to start tracking its development.
Objetivo: Automatizar o fluxo de preparação e inserção de ensaios de mandioca na plataforma CassavaBase, assegurando padronização dos dados, consistência entre experimentos e reprodutibilidade das análises.
Nesta etapa são carregados os pacotes essenciais para manipulação, leitura e escrita de dados:
.xlsx.Além disso, o script verifica se todos os pacotes estão instalados e,
caso contrário, realiza a instalação automaticamente. Também é criada a
pasta output/ (se ainda não existir), onde serão
armazenados os arquivos de saída gerados pelo pipeline.
# Lista de pacotes necessários
packages <- c("tidyverse", "readxl", "writexl", "stringr")
# Instala e carrega pacotes automaticamente
for (pkg in packages) {
if (!requireNamespace(pkg, quietly = TRUE)) {
install.packages(pkg)
}
library(pkg, character.only = TRUE)
}
# Garante que a pasta de saída exista
if (!dir.exists("output")) dir.create("output")
👉 Dessa forma, o ambiente de trabalho é configurado de maneira segura e reprodutível, garantindo que todas as dependências estejam disponíveis e que os resultados sejam organizados em um diretório específico.
Nesta etapa, são carregados os arquivos de entrada em formato Excel, que fornecem as informações necessárias para o pipeline:
Esses arquivos permitem integrar informações históricas com os novos dados, garantindo consistência no processo de inserção.
message("Carregando arquivos de entrada...")
trials_in_cassava_base <- read_excel("data/Trials-in-cassava-base.xlsx")
acessions_in_cassava_base <- read_excel("data/sinonimous.xlsx")
abreviation_trials <- read_excel("data/locais e siglas dos experimentos 2021.xlsx")
trial_to_insert <- read_excel("data/Dados_hibridos2.xlsx", sheet = 2)
Após a importação, os datasets passam por uma etapa de limpeza e padronização, garantindo que todos estejam em um formato uniforme antes das análises.
As principais ações realizadas são:
- Conversão de colunas de texto e numéricas em fatores
(facilitando agrupamentos e comparações).
- Exclusão de colunas sem variabilidade (constantes),
que não contribuem para as análises.
- Padronização dos nomes de locais em maiúsculas,
evitando inconsistências de digitação.
Esse processo assegura que os dados estejam prontos para integração e análises subsequentes.
# Função auxiliar para padronizar datasets
clean_data <- function(df) {
df %>%
mutate(across(where(is.character), as.factor)) %>%
mutate(across(where(is.numeric), as.factor)) %>%
select(where(~ n_distinct(.) > 1))
}
# Aplicando a função de limpeza
trials_in_cassava_base <- clean_data(trials_in_cassava_base)
trial_to_insert <- trial_to_insert %>%
mutate(Local = toupper(Local)) %>%
clean_data()
abreviation_trials <- abreviation_trials %>%
mutate(Local = toupper(Local)) %>%
clean_data()
👉 Ao final desta etapa, todos os datasets estão padronizados e consistentes, prontos para a geração de resumos e integração com as abreviações de locais.
Nesta etapa, é gerado um resumo agrupado dos ensaios que serão inseridos na CassavaBase, com base nas seguintes variáveis:
Município → cidade onde o experimento foi
conduzidoLocal → nome do local experimentalCampo → identificação do campo ou área de plantioBreeding stage → estágio do programa de melhoramento
genéticoEsse resumo permite uma visualização rápida da distribuição dos ensaios, facilitando a conferência e validação antes da integração com a base.
resumo_mun <- trial_to_insert %>%
group_by(Município, Local, Campo, `Breeding stage`) %>%
tally()
# Para exportar o resumo, descomente a linha abaixo:
# writexl::write_xlsx(resumo_mun, "output/resumo_municipio.xlsx")
👉 Esse relatório pode ser utilizado para auditoria interna, conferência com parceiros da EMBRAPA ou como documentação complementar no processo de submissão à CassavaBase.
Nesta etapa, o dataset principal (trial_to_insert) é
integrado à tabela de abreviações de locais
(abreviation_trials) com base na variável
Local.
Esse processo é fundamental para:
- Padronizar os nomes dos locais experimentais.
- Associar cada ensaio à sua sigla oficial.
- Facilitar a criação de identificadores únicos para os ensaios.
A junção garante que todos os experimentos estejam corretamente vinculados às abreviações utilizadas na CassavaBase e em relatórios oficiais da EMBRAPA.
trial_to_insert2 <- trial_to_insert %>%
left_join(abreviation_trials, by = "Local")
👉 Com essa integração, o dataset passa a conter informações padronizadas sobre os locais, permitindo gerar nomes de ensaios consistentes e evitar duplicidades na base.
Alguns experimentos possuem características específicas que precisam
ser refletidas nos nomes dos ensaios, como:
- Waxy → ensaios com genótipos cerosos.
- 16CM → campos com espaçamento ou estrutura
específica.
- 8MP → campos com múltiplas parcelas ou manejo
diferenciado.
Nesta etapa, são criados dois identificadores para cada ensaio:
- trial_name → nome padrão do ensaio.
- trial_name_suggest → nome alternativo que incorpora a
característica especial.
Esses nomes são fundamentais para garantir unicidade, rastreabilidade e consistência na inserção dos dados na CassavaBase.
# Função auxiliar para gerar nomes de ensaios com características específicas
create_trial_names <- function(df, stage_suffix = NULL, filter_expr = NULL) {
df %>%
filter(!!rlang::parse_expr(filter_expr)) %>%
group_by(Ano, `Breeding stage`, Abbreviation, Campo) %>%
tally() %>%
mutate(
trial_name = paste("BR", `Breeding stage`, as.numeric(as.character(Ano)) - 2001, Abbreviation, sep = "."),
trial_name_suggest = paste("BR", paste(`Breeding stage`, stage_suffix, sep = ""), as.numeric(as.character(Ano)) - 2001, Abbreviation, sep = ".")
) %>%
ungroup()
}
# Aplicando a função para diferentes tipos de ensaio
trial1 <- create_trial_names(trial_to_insert2, "Wx", "Waxy == 'SIM'")
trial2 <- create_trial_names(trial_to_insert2, "16CM", "str_detect(Campo, '16CM')")
trial3 <- create_trial_names(trial_to_insert2, "8MP", "str_detect(Campo, '8MP')")
# Consolidando os nomes alternativos
trial_names_differ <- full_join(trial2, trial3)
👉 Com essa etapa, o pipeline passa a reconhecer e nomear corretamente os ensaios com características especiais, evitando duplicidades e facilitando a identificação no sistema.
Nesta etapa, consolidamos todas as informações em um único dataset
(trial_to_insert3) que será a base para geração dos
arquivos de saída.
As ações realizadas incluem:
- Correção de nomes de genótipos, padronizando prefixos
como BR-11, BR-12.
- Criação dos identificadores de ensaio
(trial_name e trial_name_suggest).
- Verificação de existência dos ensaios e acessos na
CassavaBase.
- Identificação de nomes corretos já cadastrados.
- Criação do identificador único de parcela
(plot_name_suggest).
Essas verificações garantem que os dados estejam prontos para exportação, evitando duplicidades e inconsistências na base.
trial_to_insert3 <- trial_to_insert2 %>%
full_join(trial_names_differ[-6]) %>%
mutate(
Genotipo = str_replace_all(Genotipo, c("2011" = "BR-11", "2012" = "BR-12")),
trial_name = paste("BR", `Breeding stage`, as.numeric(as.character(Ano)) - 2001, Abbreviation, sep = "."),
trial_name_suggest = if_else(is.na(trial_name_suggest), trial_name, trial_name_suggest),
trial_inserted_in_cassava = if_else(
trial_name %in% levels(trials_in_cassava_base$`Trial name`) |
Campo %in% levels(trials_in_cassava_base$`Trial name`) |
trial_name_suggest %in% levels(trials_in_cassava_base$`Trial name`),
"yes", "no"
),
correct_trial_inserted_in_cassava = if_else(
trial_name_suggest %in% levels(trials_in_cassava_base$`Trial name`),
"yes", "no"
),
acces_in_cassava = if_else(
Genotipo %in% acessions_in_cassava_base$`germplasmName (Stock_Name)`,
"yes", "no"
),
plot_name_suggest = paste(trial_name_suggest, Genotipo, Plot, sep = "-")
)
👉 Ao final desta etapa, temos um dataset completo, validado e enriquecido, pronto para gerar os arquivos de ensaio e fenotípicos que serão inseridos na CassavaBase.
Antes de gerar os arquivos finais para inserção na CassavaBase, esta etapa produz dois relatórios de conferência que ajudam a validar a integridade dos dados:
trials → resumo dos ensaios, agrupando por ano, estágio
de melhoramento, município, campo e status de inserção.acess → resumo dos genótipos (acessos), indicando se já
estão cadastrados na CassavaBase.Esses relatórios funcionam como checkpoints de auditoria, permitindo identificar duplicidades, inconsistências ou lacunas antes da exportação final.
# Resumo dos ensaios
trials <- trial_to_insert3 %>%
group_by(
Ano,
`Breeding stage`,
Município,
Abbreviation,
Campo,
trial_name,
trial_name_suggest,
trial_inserted_in_cassava,
correct_trial_inserted_in_cassava
) %>%
tally()
# Resumo dos acessos
acess <- trial_to_insert3 %>%
group_by(Genotipo, acces_in_cassava) %>%
tally()
# Exporta o resumo dos acessos
write_xlsx(acess, "output/resumo_acess.xlsx")
# Para exportar o resumo dos ensaios, descomente a linha abaixo:
# write_xlsx(trials, "output/resumo_trials.xlsx")
👉 Com esses resumos, você pode realizar uma validação final dos dados antes de seguir para a geração dos arquivos de ensaio e fenotípicos.
Nesta etapa, o pipeline gera os arquivos .xls contendo
os dados de cada ensaio que ainda não foi inserido na
CassavaBase.
Cada arquivo representa um experimento e inclui:
- Identificador único da parcela (plot_name)
- Nome do acesso genético (accession_name)
- Número da parcela e bloco
- Indicação se é um cultivar de controle
(is_a_control)
- Informações complementares para importação: replicação, coordenadas,
lote de sementes, etc.
Esses arquivos são gerados automaticamente e salvos na pasta
output/, prontos para serem importados na plataforma.
# Lista de cultivares considerados como controle
cultivars <- c("Aipim Abacate","Baianinha-MS","BRS Caipira","BRS CS01","BRS Dourada",
"BRS Formosa","BRS Gema de Ovo","BRS Jari","BRS Kiriris","BRS Mulatinha",
"BRS Novo Horizonte","BRS Poti Branca","BRS Tapioqueira","BRS Verdinha",
"Cacau","Cascuda","Cigana Preta","Correntao","Corrente","Eucalipto",
"Fecula Branca","IAC-12","IAC-14","IAC-576","IAC-90","Mani Branca",
"Nega Maluca","Olho Junto","Pioneira","Salangor","Tailandia","Valencia","Vassoura Preta")
# Filtra apenas os ensaios que ainda não foram inseridos
creating_trials1 <- trial_to_insert3 %>%
filter(trial_inserted_in_cassava == "no")
# Loop para gerar um arquivo por ensaio
for (i in unique(creating_trials1$trial_name_suggest)) {
creating_trials <- creating_trials1 %>%
filter(trial_name_suggest == i) %>%
mutate(
is_a_control = if_else(Genotipo %in% cultivars, 1, NA_integer_),
rep_number = Bloco,
range_number = NA,
seedlot_name = NA,
num_seed_per_plot = NA,
weight_gram_seed_per_plot = NA,
plot_name_suggest = str_replace_all(plot_name_suggest, " ", "-"),
Genotipo = str_replace_all(Genotipo, " ", "-")
) %>%
select(
plot_name = plot_name_suggest,
accession_name = Genotipo,
plot_number = Plot,
block_number = Bloco,
is_a_control, rep_number, range_number,
row_number, col_number,
seedlot_name, num_seed_per_plot, weight_gram_seed_per_plot
)
# Exporta o arquivo do ensaio
#write_xlsx(creating_trials, paste0("output/locais corretos/", i, ".xls"))
}
👉 Ao final desta etapa, todos os ensaios pendentes estarão organizados em arquivos individuais, prontos para serem inseridos na CassavaBase com os campos exigidos pela plataforma.
Nesta etapa, o pipeline gera os arquivos contendo os dados fenotípicos observados nos ensaios, que complementam os arquivos de estrutura experimental.
São produzidos dois tipos de arquivos:
acess_pheno.xls → contém as variáveis fenotípicas
associadas a cada acesso (genótipo), com base nas parcelas
sugeridas.phenotype_acession_YYYY.xls → arquivos separados por
ano (Ano), contendo os dados fenotípicos específicos de
cada safra.Esses arquivos são essenciais para alimentar a CassavaBase com informações agronômicas, permitindo análises genéticas, comparações entre genótipos e estudos de estabilidade.
# Criação do arquivo geral de acessos fenotípicos
creating_acess <- creating_trials1 %>%
select(plot_name_suggest, 13:69) %>%
mutate(plot_name_suggest = str_replace_all(plot_name_suggest, " ", "-")) %>%
rename(observationunit_name = plot_name_suggest)
write_xlsx(creating_acess, "output/acess_pheno.xls")
# Criação dos arquivos fenotípicos por ano
years <- unique(trial_to_insert$Ano)
for (yr in years) {
message("Processando dados fenotípicos para o ano: ", yr)
phenotype_acession <- trial_to_insert %>%
filter(Ano == yr) %>%
select(Plot_name, contains("|")) %>%
rename(observationunit_name = Plot_name) %>%
mutate(across(everything(), as.factor)) %>%
select(where(~ n_distinct(.) > 1)) %>%
droplevels()
output_file <- paste0("output/phenotyping/phenotype_acession_", yr, ".xls")
#write_xlsx(phenotype_acession, output_file)
}
message("✅ Geração de dados fenotípicos concluída com sucesso.")
👉 Com essa etapa finalizada, o pipeline entrega todos os arquivos necessários para a inserção completa dos ensaios e acessos na CassavaBase, incluindo estrutura experimental e dados fenotípicos por ano.
sessionInfo()
R version 4.5.1 (2025-06-13 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26100)
Matrix products: default
LAPACK version 3.12.1
locale:
[1] LC_COLLATE=Portuguese_Brazil.utf8 LC_CTYPE=Portuguese_Brazil.utf8
[3] LC_MONETARY=Portuguese_Brazil.utf8 LC_NUMERIC=C
[5] LC_TIME=Portuguese_Brazil.utf8
time zone: America/Sao_Paulo
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] writexl_1.5.4 readxl_1.4.5 lubridate_1.9.4 forcats_1.0.0
[5] stringr_1.5.2 dplyr_1.1.4 purrr_1.1.0 readr_2.1.5
[9] tidyr_1.3.1 tibble_3.3.0 ggplot2_4.0.0 tidyverse_2.0.0
loaded via a namespace (and not attached):
[1] sass_0.4.10 generics_0.1.4 stringi_1.8.7 hms_1.1.3
[5] digest_0.6.37 magrittr_2.0.4 evaluate_1.0.5 grid_4.5.1
[9] timechange_0.3.0 RColorBrewer_1.1-3 fastmap_1.2.0 cellranger_1.1.0
[13] rprojroot_2.1.1 workflowr_1.7.2 jsonlite_2.0.0 promises_1.3.3
[17] scales_1.4.0 jquerylib_0.1.4 cli_3.6.5 rlang_1.1.6
[21] withr_3.0.2 cachem_1.1.0 yaml_2.3.10 tools_4.5.1
[25] tzdb_0.5.0 httpuv_1.6.16 vctrs_0.6.5 R6_2.6.1
[29] lifecycle_1.0.4 git2r_0.36.2 fs_1.6.6 pkgconfig_2.0.3
[33] pillar_1.11.1 bslib_0.9.0 later_1.4.4 gtable_0.3.6
[37] glue_1.8.0 Rcpp_1.1.0 xfun_0.53 tidyselect_1.2.1
[41] rstudioapi_0.17.1 knitr_1.50 farver_2.1.2 htmltools_0.5.8.1
[45] rmarkdown_2.29 compiler_4.5.1 S7_0.2.0
Weverton Gomes da Costa, Pós-Doutorando – EMBRAPA Mandioca e Fruticultura, wevertonufv@gmail.com↩︎