#| '!! shinylive warning !!': |
#| shinylive does not work in self-contained HTML documents.
#| Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 700
#| viewerWidth: "100%"
## file: app.R
# ====================================================================
# 1. CÓDIGO DO APLICATIVO
# ====================================================================
library(shiny)
library(shinyjs)
library(shinyWidgets)
library(shinythemes)
library(markdown)
#################################
### Data Loading & Processing
#################################
# Após a planilha excel pronta, Exporte apenas na hora de atualizar o app:
# Quando a edição estiver pronta, você vai em Arquivo > Salvar Como
# e escolhe o formato CSV UTF-8 (Delimitado por vírgulas) (*.csv).
# Salve as três abas em arquivos .csv separadamente, pois o CSV não suporta abas
# Lendo os arquivos CSV.
# O fileEncoding = "UTF-8" garante que os acentos (á, ç, ã) não quebrem.
# O sep = "," é o padrão, mas se o seu Excel em português salvar
# separando por ponto e vírgula, troque para sep = ";"
raw_data <- read.csv("matrix.csv", sep = ";", check.names = FALSE, stringsAsFactors = FALSE)
char_info <- read.csv("info_caracteres.csv", sep = ";", stringsAsFactors = FALSE)
esp_info <- read.csv("info_especies.csv", sep = ";", stringsAsFactors = FALSE)
# Limpeza inicial
linhas_validas_raw <- (!is.na(raw_data[,1])) & (trimws(raw_data[,1]) != "")
raw_data <- raw_data[linhas_validas_raw, ]
linhas_validas_char <- (!is.na(char_info[,1])) & (trimws(char_info[,1]) != "")
char_info <- char_info[linhas_validas_char, ]
linhas_validas_esp <- (!is.na(esp_info[,1])) & (trimws(esp_info[,1]) != "")
esp_info <- esp_info[linhas_validas_esp, ]
# Função para verificar se um caractere/categoria tem Info preenchida
tem_info <- function(nome) {
idx <- which(char_info$Caractere == nome)
if (length(idx) > 0) {
if (!is.na(char_info$Descricao_Texto[idx[1]]) && trimws(char_info$Descricao_Texto[idx[1]]) != "") {
return(TRUE)
}
cols_foto <- grep("Foto", colnames(char_info), value = TRUE)
for (col in cols_foto) {
if (!is.na(char_info[[col]][idx[1]]) && trimws(char_info[[col]][idx[1]]) != "") {
return(TRUE)
}
}
}
return(FALSE)
}
# Processamento hierárquico dos dados
sp_names <- colnames(raw_data)[-c(1,2)]
mat_binary <- data.frame()
tree_list <- list()
todas_as_opcoes <- c()
for (i in seq_len(nrow(raw_data))) {
g <- trimws(raw_data[i, 1])
c <- trimws(raw_data[i, 2])
vals <- raw_data[i, -c(1,2)]
vals[is.na(vals)] <- ""
states <- unique(trimws(unlist(strsplit(as.character(vals), "/"))))
states <- states[states != ""]
if(length(states) == 0) next
if(is.null(tree_list[[g]])) tree_list[[g]] <- list()
if(is.null(tree_list[[g]][[c]])) tree_list[[g]][[c]] <- list()
for (st in states) {
tree_list[[g]][[c]][[st]] <- st
todas_as_opcoes <- unique(c(todas_as_opcoes, st))
bin_row <- sapply(vals, function(v) {
if (is.na(v)) return(0)
if (trimws(v) == "") return(0)
parts <- trimws(unlist(strsplit(as.character(v), "/")))
if (st %in% parts) 1 else 0
})
row_id <- paste(g, c, st, sep = "___")
tmp_df <- data.frame(matrix(bin_row, nrow=1))
colnames(tmp_df) <- sp_names
rownames(tmp_df) <- row_id
mat_binary <- rbind(mat_binary, tmp_df)
}
}
mat <- mat_binary
fam <- data.frame(ID = c(1:ncol(mat)), Especie = colnames(mat), stringsAsFactors = FALSE)
#################################
### UI (Interface do Usuário)
#################################
ui <- fluidPage(
tags$head(
tags$style(HTML("
body { padding-top: 80px !important; }
details > summary { list-style-type: '▶ '; }
details[open] > summary { list-style-type: '▼ '; }
"))
),
navbarPage("Trepadeiras do Morro Santana", theme = shinytheme("lumen"), position="fixed-top",
tabPanel("Identificação",
sidebarLayout(
sidebarPanel(
useShinyjs(),
titlePanel("Caracteres"),
helpText("Navegue pelas pastas e selecione as características observadas. Clique em [Info] para fotos e descrições."),
br(),
uiOutput("native_tree"),
tags$hr(),
actionButton("clean.button.1", "Limpar Seleção", icon=icon("refresh", lib="glyphicon"))
),
mainPanel(
titlePanel("Espécie(s)"),
helpText("Clique no nome da espécie para ver fotos e texto com caracteres adicionais."),
br(),
textOutput("especies.n"),
textOutput("caracteres.n"),
br(),
uiOutput("especies.keep"),
tags$hr(),
uiOutput("titulo.excluidas"),
uiOutput("especies.excluidas")
)
)
),
tabPanel("Comparação",
titlePanel("Comparação"),
sidebarLayout(
sidebarPanel(
useShinyjs(),
titlePanel("Espécies"),
helpText("Selecione 1 ou mais espécies para comparar."),
dropdown(checkboxGroupInput(inputId = "especies.sel",
label = "Espécies:",
choices = fam$Especie),
label = "Selecionar Espécies"),
br(),
radioButtons(inputId = "chars.sel",
label = "Mostrar Caracteres:",
choices = c(
"Distintivos" = "distintivos",
"Semelhantes" = "semelhantes",
"Todos" = "todos"), selected="distintivos"
),
br(),
actionButton("clean.button.2", "Limpar", icon=icon("refresh", lib="glyphicon"))
),
mainPanel(
titlePanel("Tabela comparativa"),
textOutput("especies.sel.n"),
textOutput("chars.sel.n"),
br(),
tableOutput("especies.comp")
)
)
),
tabPanel("Sobre",
fluidPage(
includeMarkdown("about.Rmd")
)
)
)
)
#################################
### Server (Lógica do Servidor)
#################################
server <- function(input, output, session) {
output$native_tree <- renderUI({
tagList(
lapply(names(tree_list), function(g) {
char_ui <- lapply(names(tree_list[[g]]), function(c) {
states_orig <- names(tree_list[[g]][[c]])
# ORDENAÇÃO: Separar os que começam com "sem" e o resto
is_sem <- grepl("^sem\\b", tolower(states_orig))
states_sem <- sort(states_orig[is_sem])
states_other <- sort(states_orig[!is_sem])
states <- c(states_sem, states_other)
choice_values <- paste(g, c, states, sep = "___")
# Renderiza Info condicional para cada ESTADO final
choice_names <- lapply(states, function(st) {
if (tem_info(st)) {
evt_click <- paste0("event.stopPropagation(); event.preventDefault(); Shiny.setInputValue('link_char_clicado', '", st, "', {priority: 'event'}); return false;")
HTML(paste0(st, ' <a href="#" style="font-size: 13px; margin-left: 6px; color: #337ab7; text-decoration: none;" onclick="', evt_click, '">[Info]</a>'))
} else {
HTML(st)
}
})
# NEGRITO para o CHARACTER (Subcategoria)
c_label <- HTML(paste0("<b>", c, "</b>"))
if (tem_info(c)) {
evt_click_c <- paste0("event.stopPropagation(); event.preventDefault(); Shiny.setInputValue('link_char_clicado', '", c, "', {priority: 'event'}); return false;")
c_label <- HTML(paste0("<b>", c, "</b>", ' <a href="#" style="font-size: 13px; margin-left: 6px; color: #337ab7; text-decoration: none;" onclick="', evt_click_c, '">[Info]</a>'))
}
checkboxGroupInput(
inputId = paste("cb", gsub("[^a-zA-Z0-9]", "", g), gsub("[^a-zA-Z0-9]", "", c), sep = "_"),
label = c_label,
choiceNames = choice_names,
choiceValues = choice_values
)
})
# Renderiza Info condicional para o GROUP (Categoria Principal)
g_label <- tags$strong(g, style="font-size: 16px; color: #337ab7; cursor: pointer;")
if (tem_info(g)) {
evt_click_g <- paste0("event.stopPropagation(); event.preventDefault(); Shiny.setInputValue('link_char_clicado', '", g, "', {priority: 'event'}); return false;")
g_label <- tagList(
g_label,
HTML(paste0(' <a href="#" style="font-size: 13px; margin-left: 6px; color: #e67e22; text-decoration: none;" onclick="', evt_click_g, '">[Info]</a>'))
)
}
tags$details(
style = "margin-bottom: 10px;",
tags$summary(g_label),
tags$div(style = "margin-left: 20px; margin-top: 10px;", char_ui)
)
})
)
})
chars_selecionados <- reactive({
sel <- c()
for (g in names(tree_list)) {
for (c in names(tree_list[[g]])) {
id <- paste("cb", gsub("[^a-zA-Z0-9]", "", g), gsub("[^a-zA-Z0-9]", "", c), sep = "_")
if (!is.null(input[[id]])) {
sel <- c(sel, input[[id]])
}
}
}
sel
})
observeEvent(chars_selecionados(), {
x_limpo <- chars_selecionados()
if (length(x_limpo) > 0) {
char.n <- length(x_limpo)
m0 <- mat[rownames(mat) %in% x_limpo, , drop = FALSE]
m0_soma <- colSums(m0)
especies_keep <- colnames(m0)[m0_soma == nrow(m0)]
especies_excluidas <- colnames(m0)[m0_soma < nrow(m0)]
} else {
char.n <- 0
especies_keep <- fam$Especie
especies_excluidas <- character(0)
}
especies_keep <- sort(especies_keep)
especies_excluidas <- sort(especies_excluidas)
output$especies.n <- renderText(paste(length(especies_keep), "espécie(s) restante(s)"))
output$caracteres.n <- renderText(paste(char.n, "caractere(s) selecionado(s)"))
if(length(especies_keep) > 0) {
links_especies <- lapply(especies_keep, function(esp) {
evt_click <- paste0("Shiny.setInputValue('especie_clicada', '", esp, "', {priority: 'event'}); return false;")
HTML(paste0('<div style="margin-bottom: 5px;"><a href="#" style="font-size: 16px;" onclick="', evt_click, '">', esp, '</a></div>'))
})
output$especies.keep <- renderUI({ tagList(links_especies) })
} else {
output$especies.keep <- renderUI({ HTML("<b>Nenhuma espécie atende aos critérios selecionados.</b>") })
}
if(length(especies_excluidas) > 0) {
output$titulo.excluidas <- renderUI({ h4(paste(length(especies_excluidas), "espécie(s) excluída(s):")) })
links_excluidas <- lapply(especies_excluidas, function(esp) {
evt_click <- paste0("Shiny.setInputValue('especie_excluida_clicada', '", esp, "', {priority: 'event'}); return false;")
HTML(paste0('<div style="margin-bottom: 5px;"><s style="color: #888; font-size: 14px;">', esp, '</s> <a href="#" style="font-size: 12px; margin-left: 5px; color: #d9534f;" onclick="', evt_click, '">[Motivo]</a></div>'))
})
output$especies.excluidas <- renderUI({ tagList(links_excluidas) })
} else {
output$titulo.excluidas <- renderUI({ HTML("") })
output$especies.excluidas <- renderUI({ HTML("") })
}
updateCheckboxGroupInput(session = session, inputId = "especies.sel", choices = fam$Especie)
}, ignoreNULL = FALSE)
observeEvent(input$link_char_clicado, {
char_nome <- input$link_char_clicado
dados_char <- char_info[char_info$Caractere == char_nome, ]
texto <- "Dados não encontrados para este estado/caractere. Verifique se o nome confere com o arquivo de informações."
fotos_html <- ""
if(nrow(dados_char) > 0) {
texto <- dados_char$Descricao_Texto[1]
if (is.na(texto) || trimws(texto) == "") {
texto <- "Sem descrição disponível."
}
colunas_foto <- grep("Foto", colnames(dados_char), value = TRUE)
fotos_validas <- c()
for (col in colunas_foto) {
if (!is.na(dados_char[[col]]) && trimws(dados_char[[col]]) != "") {
fotos_validas <- c(fotos_validas, trimws(dados_char[[col]]))
}
}
if(length(fotos_validas) > 0) {
id_carrossel <- paste0("carrossel_char_", gsub("[^a-zA-Z0-9]", "", char_nome))
items <- ""
for (i in seq_along(fotos_validas)) {
active_class <- ifelse(i == 1, "item active", "item")
# Limitando altura máxima em 55vh para não estourar a tela
items <- paste0(items, '<div class="', active_class, '"><img src="', fotos_validas[i], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
}
if(length(fotos_validas) > 1) {
# Carrossel clássico: as setas ficam sobre a imagem (não ocupam espaço de largura)
fotos_html <- paste0('
<div id="', id_carrossel, '" class="carousel slide" data-ride="carousel" data-interval="false" style="margin-top: 20px;">
<div class="carousel-inner">', items, '</div>
<a class="left carousel-control" href="#', id_carrossel, '" data-slide="prev" style="background-image: none; width: 10%;">
<span class="glyphicon glyphicon-chevron-left" style="color: #337ab7; text-shadow: none;"></span>
</a>
<a class="right carousel-control" href="#', id_carrossel, '" data-slide="next" style="background-image: none; width: 10%;">
<span class="glyphicon glyphicon-chevron-right" style="color: #337ab7; text-shadow: none;"></span>
</a>
</div>')
} else {
fotos_html <- paste0('<div style="margin-top: 20px; text-align: center;"><img src="', fotos_validas[1], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
}
}
}
showModal(modalDialog(
title = char_nome,
size = "xl",
p(texto, style = "font-size: 15px; text-align: justify;"),
HTML(fotos_html),
easyClose = TRUE,
footer = modalButton("Fechar")
))
})
observeEvent(input$especie_clicada, {
esp_nome <- input$especie_clicada
dados_esp <- esp_info[esp_info$Especie == esp_nome, ]
texto <- "Dados não encontrados para esta espécie."
fotos_html <- ""
if(nrow(dados_esp) > 0) {
texto <- dados_esp$Descricao_Texto[1]
if (is.na(texto) || trimws(texto) == "") {
texto <- "Sem descrição disponível."
}
colunas_foto <- grep("Foto", colnames(dados_esp), value = TRUE)
fotos_validas <- c()
for (col in colunas_foto) {
if (!is.na(dados_esp[[col]]) && trimws(dados_esp[[col]]) != "") {
fotos_validas <- c(fotos_validas, trimws(dados_esp[[col]]))
}
}
if(length(fotos_validas) > 0) {
id_carrossel <- paste0("carrossel_esp_", gsub("[^a-zA-Z0-9]", "", esp_nome))
items <- ""
for (i in seq_along(fotos_validas)) {
active_class <- ifelse(i == 1, "item active", "item")
items <- paste0(items, '<div class="', active_class, '"><img src="', fotos_validas[i], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
}
if(length(fotos_validas) > 1) {
fotos_html <- paste0('
<div id="', id_carrossel, '" class="carousel slide" data-ride="carousel" data-interval="false" style="margin-top: 20px;">
<div class="carousel-inner">', items, '</div>
<a class="left carousel-control" href="#', id_carrossel, '" data-slide="prev" style="background-image: none; width: 10%;">
<span class="glyphicon glyphicon-chevron-left" style="color: #337ab7; text-shadow: none;"></span>
</a>
<a class="right carousel-control" href="#', id_carrossel, '" data-slide="next" style="background-image: none; width: 10%;">
<span class="glyphicon glyphicon-chevron-right" style="color: #337ab7; text-shadow: none;"></span>
</a>
</div>')
} else {
fotos_html <- paste0('<div style="margin-top: 20px; text-align: center;"><img src="', fotos_validas[1], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
}
}
}
showModal(modalDialog(
title = esp_nome,
size = "xl",
p(texto, style = "font-size: 15px; text-align: justify;"),
HTML(fotos_html),
easyClose = TRUE,
footer = modalButton("Fechar")
))
})
observeEvent(input$especie_excluida_clicada, {
esp_nome <- input$especie_excluida_clicada
x_limpo <- chars_selecionados()
if(length(x_limpo) > 0) {
m_esp <- mat[x_limpo, esp_nome, drop = FALSE]
chars_faltantes <- rownames(m_esp)[m_esp[,1] == 0]
texto_motivo <- paste0("<p>A espécie <b>", esp_nome, "</b> foi excluída pois <b>não possui</b> o(s) seguinte(s) caractere(s) selecionado(s):</p><ul>")
for (c in chars_faltantes) {
nome_bonito <- gsub("___", " > ", c)
texto_motivo <- paste0(texto_motivo, "<li>", nome_bonito, "</li>")
}
texto_motivo <- paste0(texto_motivo, "</ul>")
} else {
texto_motivo <- "Nenhum caractere selecionado."
}
showModal(modalDialog(
title = paste("Motivo da exclusão:", esp_nome),
size = "xl",
HTML(texto_motivo),
easyClose = TRUE,
footer = modalButton("Fechar")
))
})
observeEvent(input$clean.button.1, {
for (g in names(tree_list)) {
for (c in names(tree_list[[g]])) {
id <- paste("cb", gsub("[^a-zA-Z0-9]", "", g), gsub("[^a-zA-Z0-9]", "", c), sep = "_")
updateCheckboxGroupInput(session, id, selected = character(0))
}
}
})
observeEvent(c(input$especies.sel, input$chars.sel), {
f0 <- input$especies.sel
chars.sel.option <- input$chars.sel
if (length(f0) > 0) {
m0 <- mat[, colnames(mat) %in% f0, drop = FALSE]
if (chars.sel.option == "semelhantes" && length(f0) > 0) {
row_sums <- rowSums(m0)
keep_rows <- as.logical(row_sums == ncol(m0))
m0 <- m0[keep_rows, , drop = FALSE]
}
if (chars.sel.option == "distintivos" && length(f0) > 1) {
row_sums <- rowSums(m0)
keep_rows <- as.logical(row_sums > 0 & row_sums < ncol(m0))
m0 <- m0[keep_rows, , drop = FALSE]
}
m0_texto <- as.data.frame(lapply(m0, function(coluna) {
ifelse(coluna == 1, "X", "")
}), stringsAsFactors = FALSE, check.names = FALSE)
rownames(m0_texto) <- gsub("___", " > ", rownames(m0))
output$especies.sel.n <- renderText(paste(length(f0), "espécie(s) selecionada(s)"))
output$chars.sel.n <- renderText(paste(nrow(m0_texto), "caractere(s) mostrado(s)"))
output$especies.comp <- renderTable({
if(nrow(m0_texto) > 0) {
res <- cbind(Caractere = rownames(m0_texto), m0_texto)
res
} else {
data.frame(Mensagem = "Nenhum caractere compartilhado pelas espécies selecionadas.")
}
}, bordered = TRUE, rownames = FALSE, na = "")
} else {
output$especies.sel.n <- renderText("0 espécie(s) selecionada(s)")
output$chars.sel.n <- renderText("0 caractere(s) mostrado(s)")
output$especies.comp <- renderTable({ data.frame() })
}
})
observeEvent(input$clean.button.2, {
updateCheckboxGroupInput(session = session, inputId = "especies.sel", selected = character(0))
})
}
shinyApp(ui = ui, server = server)
# ====================================================================
# 2. ARQUIVOS DE DADOS (CSVs e Rmd)
# ====================================================================
# Para que o app leia os arquivos, você declara cada um usando "## file: nome_do_arquivo"
# e cola o texto bruto embaixo dele.
# Dica: Abra seus CSVs no próprio RStudio ou Bloco de Notas para copiar o texto.
## file: matrix.csv
Group;Character;Gomphrena vaga;Araujia sericifera;Ditassa burchellii;Fischeria stellata;Forsteronia glabrescens;Forsteronia thyrsoidea;Gonolobus parviflorus;Gonolobus rostratus;Macropharynx peltata;Mandevilla pentlandiana;Orthosia florida;Orthosia urceolata;Oxypetalum appendiculatum;Oxypetalum tomentosum;Oxypetalum wightianum;Prestonia coalita;Temnadenia odorifera;Aristolochia triangularis;Baccharis anomala;Baccharis trinervis;Calea pinnatifida;Lepidaploa balansae;Mikania campanulata;Mikania cordifolia;Mikania glomerata;Mikania involucrata;Mikania laevigata;Mikania micrantha;Mikania ternata;Mikania ulei;Mutisia coccinea;Mutisia speciosa;Piptocarpha sellowii;Amphilophium crucigerum;Amphilophium paniculatum;Bignonia callistegioides;Dolichandra cynanchoides;Dolichandra quadrivalvis;Dolichandra unguis-cati;Pyrostegia venusta;Tanaecium selloi;Tynanthus cognatus;Myriopus breviflorus;Varronia polycephala;Celtis spinosa;Celtis spinosissima;Valeriana scandens;Pristimera celastroides;Combretum fruticosum;Convolvulus crenatifolius;Ipomoea alba;Ipomoea bonariensis;Ipomoea cairica;Ipomoea indica;Ipomoea indivisa;Ipomoea uruguayensis;Cayaponia alarici;Cayaponia martiana;Cayaponia trilobata;Melothria cucumis;Sicydium gracile;Scleria secans;Dioscorea multiflora;Dalechampia stenosepala;Tragia volubilis;Ancistrotropis clitorioides;Canavalia bonariensis;Centrosema virginianum;Dalbergia frutescens;Desmodium uncinatum;Helicotropis hookeri;Lathyrus crassipes;Lathyrus nervosus;Lathyrus subulatus;Macropsychanthus violaceus;Macroptilium erythroloma;Macroptilium prostratum;Macroptilium psammodes;Schnella microstachya;Senegalia tucumanensis;Vigna diffusa;Strychnos brasiliensis;Heteropterys aenea;Heteropterys microcarpa;Janusia guaranitica;Stigmaphyllon jatrophifolium;Marcgravia polyantha;Cissampelos pareira;Hyperbaena domingensis;Odontocarya acuparata;Pisonia aculeata;Passiflora alata;Passiflora caerulea;Passiflora elegans;Passiflora suberosa;Passiflora tenuifila;Seguieria aculeata;Chusquea tenella;Lasiacis divaricata;Melica sarmentosa;Securidaca lanceolata;Clematis bonariensis;Clematis denticulata;Clematis discolor;Rubus imperialis;Rubus urticifolius;Chiococca alba;Galium hypocarpium;Cardiospermum halicacabum;Paullinia trigonia;Serjania glabrata;Serjania laruotteana;Smilax campestris;Smilax cognata;Solanum laxum;Tropaeolum pentaphyllum;Lantana camara;Anchietea pyrifolia;Cissus verticillata;Clematicissus striata
Folha;Tipo;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;composta;composta;simples;composta;composta;composta;composta;composta;composta;composta;composta;composta;simples;simples;simples;simples;simples/composta;simples;simples;simples;simples;simples;simples;simples;simples;simples;composta;simples;simples;simples;simples;simples;simples;composta;simples;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;composta;composta;composta;composta;composta;simples;simples;composta;composta;composta;composta;simples;simples;simples;composta;simples;simples;simples;composta
Folha;Subtipo;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples pinatissecta/simples palmatissecta/simples palmatífida;simples pinatissecta;composta pinada paripinada;composta pinada paripinada;simples inteira;composta bifoliolada/composta trifoliolada;composta bifoliolada/composta trifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada/composta trifoliolada;composta bifoliolada/composta trifoliolada;composta bifoliolada/composta trifoliolada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira/composta trifoliolada;simples inteira;simples inteira;simples inteira;simples inteira/simples palmatilobada/simples trilobada;simples inteira/simples palmatilobada;simples palmatissecta;simples inteira/simples trilobada;simples inteira;simples inteira;composta trifoliolada/composta palmada;simples trilobada/simples palmatilobada;simples trilobada;simples inteira/simples trilobada;simples inteira;simples inteira;simples inteira;composta trifoliolada;simples inteira;composta trifoliolada;composta trifoliolada;composta trifoliolada;composta pinada imparipinada;composta trifoliolada;composta trifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada;composta trifoliolada;composta trifoliolada;composta trifoliolada;composta trifoliolada;composta unifoliolada emarginada a bipartida;composta bipinada;composta trifoliolada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira/simples palmatilobada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples palmatilobada;simples trilobada;simples trilobada;simples trilobada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;composta trifoliolada;composta pinada imparipinada/composta bipinada;composta pinada imparipinada/composta bipinada;composta trifoliolada/composta palmada;composta trifoliolada/composta palmada;simples inteira;simples inteira;composta biternada;composta biternada;composta biternada;composta biternada;simples inteira;simples inteira;simples inteira/simples pinatilobada;composta palmada;simples inteira;simples inteira;simples inteira;composta palmada
Folha;Filotaxia;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;oposta;alterna;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;alterna;oposta;oposta;oposta;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;alterna;oposta;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;oposta;oposta;oposta;alterna;alterna;oposta;oposta;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;oposta;alterna;alterna;alterna
Exsudatos;Látex;sem látex;branco;branco;branco;branco;branco;branco;branco;hialino;branco;branco;branco;branco;branco;branco;hialino;branco;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;branco;hialino;branco;branco;hialino;branco;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex
Mecanismo de escalada;Tipo principal;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;apoiante;apoiante;apoiante;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;gavinha;gavinha;apoiante;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;apoiante;apoiante;apoiante;apoiante;volúvel;ramo secundário volúvel;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;gavinha;gavinha;gavinha;gavinha;gavinha;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;ramo secundário volúvel;apoiante;volúvel;gavinha;gavinha;gavinha;volúvel;volúvel;volúvel;volúvel;gavinha;apoiante;volúvel;apoiante;volúvel;volúvel;volúvel;volúvel;raízes grampiformes;volúvel;volúvel;volúvel;apoiante;gavinha;gavinha;gavinha;gavinha;gavinha;apoiante;apoiante;apoiante;gavinha;apoiante;pecíolos volúveis;pecíolos volúveis;pecíolos volúveis;apoiante;apoiante;apoiante;apoiante;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;pecíolos volúveis;pecíolos volúveis;apoiante;volúvel;gavinha;gavinha
Mecanismo de escalada;Projeções auxiliares na escalada;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;tricomas aderentes retrorsos ou uncinados;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;tricomas aderentes retrorsos ou uncinados;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;acúleos;sem projeções;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;sem projeções;sem projeções;tricomas aderentes retrorsos ou uncinados;sem projeções;sem projeções;sem projeções;sem projeções;acúleos;acúleos;sem projeções;tricomas aderentes retrorsos ou uncinados;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções
Mecanismo de escalada;Tipo de gavinha;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;ramificadas;ramificadas;sem gavinhas;discos adesivos;ramificadas;ramificadas;uncinadas;uncinadas;uncinadas;ramificadas;ramificadas;ramificadas/discos adesivos;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas/ramificadas;ramificadas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;discos adesivos
Mecanismo de escalada;Localização da gavinha;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;no folíolo terminal;no folíolo terminal;sem gavinhas;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;axilar;axilar;axilar;axilar;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;axilar;axilar;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;axilar;axilar;axilar;axilar;sem gavinhas;sem gavinhas;sem gavinhas;no ápice da folha;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;na inflorescência;na inflorescência;na inflorescência;na inflorescência;no pecíolo;no pecíolo;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;no pecíolo;oposta às folhas
## file: info_caracteres.csv
Caractere;Categoria_Tree;Descricao_Texto;Foto1;Foto2;Foto3
branco;Exsudatos;;;;
hialino;Exsudatos;;;;
sem látex;Exsudatos;;;;
Tipo;Folha;O tipo de folha define se ela possui apenas uma lâmina contínua (simples) ou se é dividida em várias lâminas menores chamadas folíolos (composta).;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_simples_vs_composta.jpg;;
composta;Folha;;;;
simples;Folha;;;;
Subtipo;Folha;As folhas simples e compostas podem apresentar diferentes morfologias e terminologias descritas nas imagens.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_subtipo_simples.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_subtipo_composta.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_subtipo_composta2.jpg
composta bipinada;Folha;;;;
composta bifoliolada;Folha;;;;
composta biternada;Folha;;;;
composta palmada;Folha;;;;
composta pinada imparipinada;Folha;;;;
composta pinada paripinada;Folha;;;;
composta trifoliolada;Folha;;;;
composta unifoliolada emarginada a bipartida;Folha;;;;
simples inteira;Folha;;;;
simples palmatífida;Folha;;;;
simples palmatissecta;Folha;;;;
simples palmatilobada;Folha;;;;
simples pinatilobada;Folha;;;;
simples pinatissecta;Folha;;;;
simples trilobada;Folha;;;;
Filotaxia;Folha;Disposição das folhas nos nós caulinares.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_filotaxia.jpg;;
alterna;Folha;;;;
oposta;Folha;;;;
apoiante;Mecanismo de escalada;Em contato com o suporte ocorrem ramificações formando uma rede, possibilitando a planta crescer sem cair. Podem apresentar acúleos, espinhos ou tricomas (ver Projeções auxiliares na escalada) que auxiliam evitando o desprendimento da planta no suporte.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_apoiante.jpg;;
gavinha;Mecanismo de escalada;Órgãos modificados para se enrolar ou prender. A imagem é uma gavinha simples não ramificada. Para outros tipos veja Tipo de gavinha e Origem da gavinha no painel de seleção.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_gavinha2.jpg;;
pecíolos volúveis;Mecanismo de escalada;Pecíolos de folhas simples ou compostas se enrolam para prender a planta.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_peciolo.jpg;;
raízes grampiformes;Mecanismo de escalada;Raízes adventícias prendem a planta ao forófito.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_raiz.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_raiz2.jpg;
ramo secundário volúvel;Mecanismo de escalada;Caules/ramos secundários se enrolam.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_ramo_sec_voluvel.jpg;;
volúvel;Mecanismo de escalada;Caule principal se enrola.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_voluvel.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_voluvel2.jpg;
sem projeções;Mecanismo de escalada;;;;
acúleos;Mecanismo de escalada;Projeções não vascularizadas, geralmente curvadas, auxiliando a planta a se prender no suporte e evitando seu desprendimento.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/projeções_aculeos.jpg;;
espinhos;Mecanismo de escalada;Projeções vascularizadas, geralmente curvadas, auxiliando a planta a se prender no suporte e evitando seu desprendimento.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/projeções_espinhos.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/projeções_espinhos2.jpg;
tricomas aderentes retrorsos ou uncinados;Mecanismo de escalada;;;;
não ramificadas;Mecanismo de escalada;Gavinhas que se enrolam no suporte e não apresentam ramificações.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_simples.jpg;;
ramificadas;Mecanismo de escalada;Gavinhas que se enrolam no suporte e apresentam duas ou mais ramificações.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_ramificada.jpg;;
uncinadas;Mecanismo de escalada;Gavinhas com ápices modificados em garras, geralmente tripartidas.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinhas_uncinadas.jpg;;
discos adesivos;Mecanismo de escalada;Gavinhas ramificadas, cujos ápices são modificados em discos adesivos que se prendem/colam no suporte.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_discos.jpg;;
sem gavinhas;Mecanismo de escalada;;;;
axilar;Mecanismo de escalada;Gavinhas se originam na axila da folha com o ramo.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_simples.jpg;;
na inflorescência;Mecanismo de escalada;Gavinha se localiza na inflorescência, nesse caso no ápice do pedunculo e na base da raque floral.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_inflorescencia.jpg;;
no ápice da folha;Mecanismo de escalada;Gavinhas sem ramificações em que o ápice foliar se enrola no suporte.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_apice_folha.jpg;;
no folíolo central;Mecanismo de escalada;O folíolo terminal de folhas compostas bifolioladas se modifica em uma gavinha.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_foliolo_central.jpg;;
no folíolo terminal;Mecanismo de escalada;O folíolo terminal de folhas compostas pinadas se modifica em uma gavinha.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_ramificada.jpg;;
no pecíolo;Mecanismo de escalada;Gavinhas se originam no pecíolo foliar.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_peciolo.jpg;;
oposta às folhas;Mecanismo de escalada;Gavinhas se originam nos nós caulinares opostas às folhas.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_oposta.jpg;;
## file: info_especies.csv
Especie;Descricao_Texto;Foto1;Foto2;Foto3
Gomphrena vaga;Características adicionais: Folhas com indumento seríceo esbranquiçado na face abaxial.;;;
Araujia sericifera;;;;
Ditassa burchellii;Características adicionais: Folhas elípticas ou obovadas, nervuras secundárias conspícuas, margem revoluta.;;;
Fischeria stellata;Características adicionais: Folhas lanceoladas, nervuras secundárias inconspícuas, margem plana.;;;
Forsteronia glabrescens;;;;
Forsteronia thyrsoidea;;;;
Gonolobus parviflorus;;;;
Gonolobus rostratus;;;;
Macropharynx peltata;;;;
Mandevilla pentlandiana;;;;
Orthosia florida;;;;
Orthosia urceolata;;;;
Oxypetalum appendiculatum;;;;
Oxypetalum tomentosum;Características adicionais: Flor com apêndice estilar branco a levemente rosado, bifurcado no ápice. Fruto do tipo folículo, liso e verde.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/oxypetalum_tomentosum.jpg;;
Oxypetalum wightianum;Características adicionais: Flor com apêndice estilar vináceo bifurcado no ápice. Fruto do tipo folículo, verrucoso e verde.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/oxypetalum_wightianum.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/oxypetalum_wightianum2.jpg;
Prestonia coalita;;;;
Temnadenia odorifera;;;;
Aristolochia triangularis;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/aristolochia_triangularis.jpg;;
Baccharis anomala;Características adicionais: Folhas trinervadas, margem recortada.;;;
Baccharis trinervis;Características adicionais: Folhas trinervadas, margem inteira.;;;
Calea pinnatifida;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/calea_pinnatifida.jpg;;
Lepidaploa balansae;;;;
Mikania campanulata;Características adicionais: Folhas discolores, roxas na face abaxial, mais evidente em plantas jovens.;;;
Mikania cordifolia;;;;
Mikania glomerata;;;;
Mikania involucrata;Características adicionais: Folhas ovado-triangulares de base truncada ou cordada, ramos jovens avermelhados.;;;
Mikania laevigata;;;;
Mikania micrantha;;;;
Mikania ternata;;;;
Mikania ulei;;;;
Mutisia coccinea;Características adicionais: Lobos foliares discolores.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/mutisia_coccinea.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/mutisia_coccinea2.jpg;
Mutisia speciosa;Características adicionais: Lobos foliares concolores.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/mutisia_speciosa.jpg;;
Piptocarpha sellowii;;;;
Amphilophium crucigerum;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/amphilophium_crucigerum.jpg;;
Amphilophium paniculatum;;;;
Bignonia callistegioides;;;;
Dolichandra cynanchoides;Características adicionais: Profilos axilares lanceolados ou deltóides, lisos.;;;
Dolichandra quadrivalvis;;;;
Dolichandra unguis-cati;Características adicionais: Profilos axilares ovados, estriados.;;;
Pyrostegia venusta;Características adicionais: Folíolos ovados, base obtusa, profilos axilares inconspícuos, caule lenhoso maduro com ritidoma se desprendendo em placas.;;;
Tanaecium selloi;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/tanaecium_selloi.jpg;;
Tynanthus cognatus;;;;
Myriopus breviflorus;;;;
Varronia polycephala;;;;
Celtis spinosa;;;;
Celtis spinosissima;;;;
Valeriana scandens;Características adicionais: base da folha assimétrica.;;;
Pristimera celastroides;;;;
Combretum fruticosum;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/combretum_fruticosum.jpg;;
Convolvulus crenatifolius;;;;
Ipomoea alba;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/ipomoea_alba.jpg;;
Ipomoea bonariensis;;;;
Ipomoea cairica;Características adicionais: Lâminas foliares palmatisectas, com cinco segmentos lanceolados ou elípticos.;;;
Ipomoea indica;;;;
Ipomoea indivisa;;;;
Ipomoea uruguayensis;;;;
Cayaponia alarici;;;;
Cayaponia martiana;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/cayaponia_martiana.jpg;;
Cayaponia trilobata;;;;
Melothria cucumis;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/melothria_cucumis.jpg;;
Sicydium gracile;;;;
Scleria secans;;;;
Dioscorea multiflora;;;;
Dalechampia stenosepala;;;;
Tragia volubilis;;;;
Ancistrotropis clitorioides;;;;
Canavalia bonariensis;Características adicionais: ramos e pecíolos glabrescentes, folhas elípticas.;;;
Centrosema virginianum;;;;
Dalbergia frutescens;;;;
Desmodium uncinatum;;;;
Helicotropis hookeri;;;;
Lathyrus crassipes;Características adicionais: ramos alados.;;;
Lathyrus nervosus;Características adicionais: ramos não alados.;;;
Lathyrus subulatus;;;;
Macropsychanthus violaceus;Características adicionais: ramos e pecíolos hirsutos, folhas orbiculares ou largo-obovadas.;;;
Macroptilium erythroloma;Características adicionais: folíolos romboides, velutinos na face abaxial.;;;
Macroptilium prostratum;;;;
Macroptilium psammodes;Características adicionais: folíolos ovado-triangulares, seríceos em ambas as faces.;;;
Schnella microstachya;Características adicionais: frutos anemocóricos do tipo sâmara.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/schnella_microstachya.jpg;;
Senegalia tucumanensis;;;;
Vigna diffusa;;;;
Strychnos brasiliensis;;;;
Heteropterys aenea;Características adicionais: Folhas discolores, com a face abaxial marcadamente dourada.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/heteropterys_aenea.jpg;;
Heteropterys microcarpa;;;;
Janusia guaranitica;;;;
Stigmaphyllon jatrophifolium;;;;
Marcgravia polyantha;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/marcgravia_polyantha.jpg;;
Cissampelos pareira;Características adicionais: Folhas reniformes, ápice obtuso, apiculado.;;;
Hyperbaena domingensis;Características adicionais: Folhas ovadas ou elípticas.;;;
Odontocarya acuparata;Características adicionais: Folhas reniformes, ápice acuminado.;;;
Pisonia aculeata;;;;
Passiflora alata;;;;
Passiflora caerulea;;;;
Passiflora elegans;Características adicionais: Nectários extraflorais na margem do limbo foliar e no pecíolo, estípulas foliáceas, folhas com os lobos suborbiculares.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/passiflora_elegans.jpg;;
Passiflora suberosa;Características adicionais: Nectários extraflorais apenas no pecíolo, estípulas linear-subuladas.;;;
Passiflora tenuifila;Características adicionais: Nectários extraflorais na margem do limbo foliar e no pecíolo, estípulas foliáceas, folhas com os lobos oblongos a ovais.;;;
Seguieria aculeata;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/seguieria_aculeata.jpg;;
Chusquea tenella;;;;
Lasiacis divaricata;;;;
Melica sarmentosa;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/gavinha_apice_folha.jpg;;
Securidaca lanceolata;;;;
Clematis bonariensis;Características adicionais: base da folha simétrica.;;;
Clematis denticulata;Características adicionais: indumento hialino.;;;
Clematis discolor;Características adicionais: indumento dourado.;;;
Rubus imperialis;Características adicionais: ramos sem cerdas, folíolos com menos de 10 pares de nervuras secundárias, glabros na face adaxial.;;;
Rubus urticifolius;Características adicionais: ramos com longas cerdas, folíolos com mais de 10 pares de nervuras secundárias, tomentosos na face adaxial.;;;
Chiococca alba;Características adicionais: com estípulas interpeciolares que podem ser caducas, frutos endozoocóricos do tipo baga e cor branca.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/chiococca_alba.jpg;;
Galium hypocarpium;;;;
Cardiospermum halicacabum;Características adicionais: herbáceas, com folíolos membranáceos.;;;
Paullinia trigonia;;;;
Serjania glabrata;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/serjania_glabrata.jpg;;
Serjania laruotteana;;;;
Smilax campestris;Características adicionais: Folhas com a margem plana.;;;
Smilax cognata;Características adicionais: Folhas com a margem espessada.;;;
Solanum laxum;;;;
Tropaeolum pentaphyllum;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/tropaeolum_pentaphyllum.jpg;;
Lantana camara;;;;
Anchietea pyrifolia;;;;
Cissus verticillata;;;;
Clematicissus striata;;;;
## file: about.Rmd
---
title: "Sobre"
author: "Guilherme D. S. Seger"
date: "August 09, 2026"
output: html_document
---
### Identificação de espécies trepadeiras do Morro Santana, Porto Alegre, RS, Brasil
Esta chave interativa foi desenvolvida como ferramenta de auxílio para a identificação de espécies de trepadeiras do Morro Santana.
Nem todas as espécies e caracteres possuem textos e imagens, que estão sendo continuamente adicionadas.
### Fonte dos dados
Essa chave iterativa foi desenvolvida com dados provenientes do manuscrito científico em desenvolvimento:
* [Seger et al. 2027](https://www.xxx)
### Código
O código utilizado para gerar está página foi originalmente gerado pelo Prof. Marcelo Reginato e obtido em: (https://github.com/mreginato/Chave_familias_BR).
O código foi adaptado para espécies e modificado com auxílio de Inteligência Artificial (IA) Google Gemini Pro.
Dentre as novidades incluídas estão as funcionalidades de links para fotos e textos nas espécies e para os caracteres. Além disso, o código para o app foi feito no formato shinyLive para possibilitar a funcionalidade da chave diretamente no site sem a necessidade de hospedá-la em um servidor.
O novo código estará em breve disponível em [download](https://github.com/GuiSeger/XXX).
:::
::::::
:::::::
<!-- Script para tornar a navbar responsiva ao scroll -->
<script>
document.addEventListener("DOMContentLoaded", function() {
const navbar = document.querySelector('.navbar');
if (navbar) {
window.addEventListener('scroll', function() {
// Quando rolar mais de 50px para baixo, adiciona a cor
if (window.scrollY > 50) {
navbar.classList.add('navbar-scrolled');
} else {
// Ao voltar para o topo, volta a ficar transparente
navbar.classList.remove('navbar-scrolled');
}
});
}
});
</script>