R Markdown

library(visNetwork) library(jsonlite) library(readxl) fluidPage( titlePanel(“Interactive Product Space Graph”),

fluidRow( column(6, selectInput(“groupSelect”, “Select Group:”, choices = c(“None” = ““))), column(6, selectInput(”bienSelect”, “Select Bien:”, choices = c(“None” = ““))) ),

mainPanel( visNetworkOutput(“network”) ) )

server <- function(input, output, session) {

# Load data file_path <- “E:/MCD 2024/data/network_hs92_4digit.json” data <- fromJSON(file_path)

ruta_archivo <- “E:/MCD 2024/data/tabla_renombrada.xlsx” datos_nombres <- read_excel(ruta_archivo)

nodes_df <- as.data.frame(data\(nodes) edges_df <- as.data.frame(data\)edges)

nodes_completos <- merge(nodes_df, datos_nombres, by = “id”, all.x = TRUE)

# Define colors unique_grupos <- unique(nodes_completos$grupo) colores_pastel <- c(“#FFB6C1”, “#FFD700”, “#FFA07A”, “#98FB98”, “#ADD8E6”, “#F08080”, “#FF6347”, “#E0FFFF”, “#FFDAB9”)

if (length(colores_pastel) < length(unique_grupos)) { colores_pastel <- rep_len(colores_pastel, length(unique_grupos)) }

colores <- setNames(colores_pastel[1:length(unique_grupos)], unique_grupos)

nodes_completos\(color <- ifelse(nodes_completos\)vcr == 1, colores[nodes_completos\(grupo], adjustcolor("lightgray", alpha.f = 0.3)) nodes_completos\)label <- paste(nodes_completos\(bien, nodes_completos\)grupo, sep = ” - “)

output\(network <- renderVisNetwork({ graph <- visNetwork(nodes = nodes_completos, edges = edges_df) %>% visOptions(highlightNearest = list(enabled = TRUE, degree = 1)) %>% visPhysics(stabilization = TRUE) %>% visEdges(color = list(color = "lightgray", opacity = 0.9)) %>% visNodes(color = list(background = nodes_completos\)color, border = “black”, borderWidth = 2), label = nodes_completos$label, shape = “dot”, size = 25) %>% visInteraction(navigationButtons = FALSE) %>% visLayout(randomSeed = 123) %>% visIgraphLayout()

graph

})

observe({ updateSelectInput(session, “groupSelect”, choices = c(“None” = ““, unique_grupos)) updateSelectInput(session,”bienSelect”, choices = c(“None” = ““, unique(nodes_completos$bien))) })

observeEvent(input\(groupSelect, { updateSelectInput(session, "bienSelect", selected = "None") if (input\)groupSelect == ““) { visNetworkProxy(”network”) %>% visUnselectAll() } else { selectedNodes <- nodes_completos[nodes_completos\(grupo == input\)groupSelect, “id”] visNetworkProxy(“network”) %>% visSelectNodes(id = selectedNodes) } })

observeEvent(input\(bienSelect, { updateSelectInput(session, "groupSelect", selected = "None") if (input\)bienSelect == ““) { visNetworkProxy(”network”) %>% visUnselectAll() } else { selectedNode <- nodes_completos[nodes_completos\(bien == input\)bienSelect, “id”] visNetworkProxy(“network”) %>% visSelectNodes(id = selectedNode) } })

observeEvent(input\(network_selectedNodes, { selectedNode <- input\)network_selectedNodes if (!is.null(selectedNode) && length(selectedNode) == 1) { selectedGroup <- nodes_completos[nodes_completos\(id == selectedNode, "grupo"] selectedBien <- nodes_completos[nodes_completos\)id == selectedNode, “bien”] updateSelectInput(session, “groupSelect”, selected = selectedGroup) updateSelectInput(session, “bienSelect”, selected = selectedBien) } }) }

shinyApp(ui = ui, server = server)