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.


📜 Script Principal — CassavaBase EMBRAPA

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.


1. Carregamento de pacotes e configuração inicial

Nesta etapa são carregados os pacotes essenciais para manipulação, leitura e escrita de dados:

  • tidyverse → manipulação e transformação de dados.
  • readxl → importação de planilhas Excel.
  • writexl → exportação de resultados em formato .xlsx.
  • stringr → manipulação e padronização de strings.

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.

2. Importação dos dados

Nesta etapa, são carregados os arquivos de entrada em formato Excel, que fornecem as informações necessárias para o pipeline:

  • Trials-in-cassava-base.xlsx → Ensaios já cadastrados na CassavaBase.
  • sinonimous.xlsx → Lista de acessos e sinônimos já existentes na base.
  • locais e siglas dos experimentos 2021.xlsx → Abreviações e padronização de nomes de locais experimentais.
  • Dados_hibridos2.xlsx → Conjunto de dados completo com os novos ensaios a serem inseridos.

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)

3. Padronização dos dados

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.


4. Resumo inicial dos ensaios

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 conduzido
  • Local → nome do local experimental
  • Campo → identificação do campo ou área de plantio
  • Breeding stage → estágio do programa de melhoramento genético

Esse 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.


5. Integração com abreviações de locais

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.


6. Criação de nomes de ensaios especiais

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.


7. Dataset final com verificações

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.


8. Resumos de ensaios e acessos

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.


9. Geração de arquivos de ensaios

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.


10. Geração de dados fenotípicos

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:

  1. acess_pheno.xls → contém as variáveis fenotípicas associadas a cada acesso (genótipo), com base nas parcelas sugeridas.
  2. 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          

  1. Weverton Gomes da Costa, Pós-Doutorando – EMBRAPA Mandioca e Fruticultura, ↩︎