Как запустить приложение Shiny для создания троичных диаграмм ggtern (R), отображающих переменные сразу после загрузки файла CSV?

Я пытаюсь создать различные троичные диаграммы ggtern с помощью приложения Shiny. Однако это больше не работает, как только я пытаюсь напрямую отобразить выбор переменных в моем CSV-файле сразу после его загрузки. Когда я пытаюсь запустить приложение, оно закрывается, и я получаю следующее сообщение об ошибке:

      Error in server(...) : objet 'data_selected' introuvable

Вот мой сценарий:

      # Installer les packages nécessaires s'ils ne sont pas déjà installés
if (!require(shiny)) install.packages("shiny")
if (!require(ggtern)) install.packages("ggtern")
if (!require(plyr)) install.packages("plyr")
if (!require(dplyr)) install.packages("dplyr")

# Charger les packages
library(shiny)
library(ggtern)
library(plyr)
library(dplyr)

# Définir l'interface utilisateur
ui <- fluidPage(
  titlePanel("Diagramme Ternaire"),
  # Sidebar
  sidebarLayout(
    sidebarPanel(
      "Générer le Diagramme Ternaire",
      width = 2,
      fileInput("dataFile", "Choisir le fichier CSV"),
      selectInput("xVar", "Variable x:", choices = NULL),
      selectInput("yVar", "Variable y:", choices = NULL),
      selectInput("zVar", "Variable z:", choices = NULL),
      actionButton("generatePlot", "Générer le Diagramme ternaire"),
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("Diagramme ternaire",
                 plotOutput("ternaryPlot")
        ),
        tabPanel("Diagramme ternaire 3 zones",
                 plotOutput("ternaryPlot3")
        ),
        tabPanel("Diagramme ternaire 4 zones",
                 plotOutput("ternaryPlot4")
        ),
        tabPanel("Diagramme ternaire 10 zones",
                 plotOutput("ternaryPlot10")
        ),
        tabPanel("Afficher le Jeu de Données",
                 tableOutput("dataTable")
        )
      )
    )
  )
)

# Définir le serveur
server <- function(input, output, session) {
  # Charger le fichier CSV en réaction au bouton "dataFile"
  data <- reactive({
    req(input$dataFile)
    df <- read.csv(input$dataFile$datapath, header = TRUE, sep = ",")
    
    # Mise à jour des choix initiaux des selectInput
    updateSelectInput(session, "xVar", choices = colnames(df))
    updateSelectInput(session, "yVar", choices = colnames(df))
    updateSelectInput(session, "zVar", choices = colnames(df))
    
    return(df)
  })
  
  observeEvent(input$dataFile, {
    # Obtenir la liste des noms de variables du fichier CSV
    var_names <- colnames(data())
  
    # Mettre à jour la liste des variables dans l'élément uiOutput
    output$variableList <- renderUI({
     selectInput("selectedVars", "Sélectionnez les variables:", choices = var_names, multiple = TRUE)
    })  
  })  
      
    # Créer les points du diagramme
    points1 <- data.frame(
      rbind(
        c(1,1.000,0.000,0.000),
        c(2,0.000,1.000,0.000),
        c(3,0.000,0.000,1.000)
      )
    )
    colnames(points1)=c("IDPoint","T","L","R")
    
    # Attribuer à chaque polygone un nombre et une étiquette
    polygon.labels1 <- data.frame(Label1=c("X"))
    polygon.labels1$IDLabel=1:nrow(polygon.labels1)
    
    # Créer une carte des polygones
    polygons1 <- data.frame(
      rbind(
        c(1,1),c(1,2),c(1,3),c(2,3)
      )
    )
    polygons1$PointOrder <- 1:nrow(polygons1)
    colnames(polygons1)=c("IDLabel","IDPoint","PointOrder")
    
    # Fusionner les trois précédents sets en un seul
    df1 <- merge(polygons1,points1)
    df1 <- merge(df1,polygon.labels1)
    df1 <- df1[order(df1$PointOrder),]
    
    # Déterminer les données des étiquettes
    Labs1=ddply(df1,"Label1",function(x){c(c(mean(x$T),mean(x$L),mean(x$R)))})
    colnames(Labs1)=c("Label","T","L","R")
    
    # Créer les points du diagramme 3
    points3 <- data.frame(
      rbind(
        c(1,1.000,0.000,0.000),
        c(2,0.500,0.500,0.000),
        c(3,0.500,0.000,0.500),
        c(4,0.500,0.500,0.500),
        c(5,0.000,1.000,0.000),
        c(6,0.000,0.500,0.500),
        c(7,0.000,0.000,1.000)
      )
    )
    colnames(points3)=c("IDPoint","T","L","R")
    
    # Attribuer à chaque polygone un nombre et une étiquette
    polygon.labels3 <- data.frame(Label3=c("X","Y","Z"))
    polygon.labels3$IDLabel=1:nrow(polygon.labels3)
    
    # Créer une carte des polygones
    polygons3 <- data.frame(
      rbind(
        c(1,1),c(1,2),c(1,4),c(1,3),
        c(2,2),c(2,4),c(2,6),c(2,5),
        c(3,3),c(3,7),c(3,6),c(3,4)
      )
    )
    polygons3$PointOrder <- 1:nrow(polygons3)
    colnames(polygons3)=c("IDLabel","IDPoint","PointOrder")
    
    # Fusionner les trois précédents sets en un seul
    df3 <- merge(polygons3,points3)
    df3 <- merge(df3,polygon.labels3)
    df3 <- df3[order(df3$PointOrder),]
    
    # Déterminer les données des étiquettes
    Labs3=ddply(df3,"Label3",function(x){c(c(mean(x$T),mean(x$L),mean(x$R)))})
    colnames(Labs3)=c("Label","T","L","R")
    
    # Créer les points du diagramme 4
    points4 <- data.frame(
      rbind(
        c(1,1.000,0.000,0.000),
        c(2,0.500,0.500,0.000),
        c(3,0.500,0.000,0.500),
        c(4,0.000,1.000,0.000),
        c(5,0.000,0.500,0.500),
        c(6,0.000,0.000,1.000)
      )
    )
    colnames(points4)=c("IDPoint","T","L","R")
    
    # Attribuer à chaque polygone un nombre et une étiquette
    polygon.labels4 <- data.frame(Label4=c("X","XYZ","Z","Y"))
    polygon.labels4$IDLabel=1:nrow(polygon.labels4)
    
    # Créer une carte des polygones
    polygons4 <- data.frame(
      rbind(
        c(1,1),c(1,2),c(1,3),
        c(2,2),c(2,5),c(2,3),
        c(3,3),c(3,5),c(3,6),
        c(4,4),c(4,5),c(4,2)
      )
    )
    polygons4$PointOrder <- 1:nrow(polygons4)
    colnames(polygons4)=c("IDLabel","IDPoint","PointOrder")
    
    # Fusionner les trois précédents sets en un seul
    df4 <- merge(polygons4,points4)
    df4 <- merge(df4,polygon.labels4)
    df4 <- df4[order(df4$PointOrder),]
    
    # Déterminer les données des étiquettes
    Labs4=ddply(df4,"Label4",function(x){c(c(mean(x$T),mean(x$L),mean(x$R)))})
    colnames(Labs4)=c("Label","T","L","R")
    
    # Créer les points du diagramme 10
    points10 <- data.frame(
      rbind(
        c(1,1.000,0.000,0.000),
        c(2,0.750,0.250,0.000),
        c(3,0.750,0.125,0.125),
        c(4,0.750,0.000,0.250),
        c(5,0.600,0.200,0.200),
        c(6,0.500,0.500,0.000),
        c(7,0.500,0.000,0.500),
        c(8,0.400,0.400,0.200),
        c(9,0.400,0.200,0.400),
        c(10,0.250,0.750,0.000),
        c(11,0.250,0.000,0.750),
        c(12,0.200,0.600,0.200),
        c(13,0.200,0.400,0.400),
        c(14,0.200,0.200,0.600),
        c(15,0.125,0.750,0.125),
        c(16,0.125,0.125,0.750),
        c(17,0.000,1.000,0.000),
        c(18,0.000,0.750,0.250),
        c(19,0.000,0.500,0.500),
        c(20,0.000,0.250,0.750),
        c(21,0.000,0.000,1.000)
      )
    )
    colnames(points10) = c("IDPoint","T","L","R")
    
    # Attribuer à chaque polygone un nombre et une étiquette
    polygon.labels10 <- data.frame(Label10=c("X","XY","XZ","XYZ","YX","ZX","Y","YZ","ZY","Z"))
    polygon.labels10$IDLabel=1:nrow(polygon.labels10)
    
    # Créer une carte des polygones
    polygons10 <- data.frame(
      rbind(
        c(1,1),c(1,2),c(1,4),
        c(2,6),c(2,2),c(2,3),c(2,5),c(2,8),
        c(3,3),c(3,4),c(3,7),c(3,9),c(3,5),
        c(4,5),c(4,14),c(4,12),
        c(5,6),c(5,8),c(5,12),c(5,15),c(5,10),
        c(6,7),c(6,11),c(6,16),c(6,14),c(6,9),
        c(7,17),c(7,10),c(7,18),
        c(8,15),c(8,12),c(8,13),c(8,19),c(8,18),
        c(9,13),c(9,14),c(9,16),c(9,20),c(9,19),
        c(10,11),c(10,21),c(10,20)
      )
    )
    polygons10$PointOrder <- 1:nrow(polygons10)
    colnames(polygons10)=c("IDLabel","IDPoint","PointOrder")
    
    # Fusionner les trois précédents sets en un seul
    df10 <- merge(polygons10,points10)
    df10 <- merge(df10,polygon.labels10)
    df10 <- df10[order(df10$PointOrder),]
    
    # Déterminer les données des étiquettes
    Labs10=ddply(df10,"Label10",function(x){c(c(mean(x$T),mean(x$L),mean(x$R)))})
    colnames(Labs10)=c("Label","T","L","R")
    
    
    # Obtenez les indices des colonnes correspondantes
    x_index <- which(colnames(data_selected) == input$xVar)
    y_index <- which(colnames(data_selected) == input$yVar)
    z_index <- which(colnames(data_selected) == input$zVar)
    ma_df <- data_selected[, c(x_index, y_index, z_index)]
    names(ma_df) <- c("x", "y", "z")
    # Vérifiez si les colonnes sélectionnées existent dans le jeu de données
    if (length(x_index) == 0 || length(y_index) == 0 || length(z_index) == 0) {
      # Affichez un message d'erreur si les colonnes n'existent pas
      showModal(modalDialog(
        title = "Erreur",
        "Les colonnes sélectionnées n'existent pas dans le jeu de données.",
        easyClose = TRUE
      ))
    } else {
      # Créer le diagramme
      base1 <- ggtern(data=df1,aes(L,T,R)) +
        geom_polygon(aes(group=Label1),color="black",alpha=0) +
        geom_text(data=Labs1, aes(label=Label), size=3, color="black") +
        geom_point(data=ma_df, aes(x, y, z), color="red", size=3) +
        theme_bw() +
        theme(plot.title=element_text(hjust=0.5)) +
        tern_limits(labels=c(10,20,30,40,50,60,70,80,90,100), breaks=seq(0.1,1,by=0.1)) +
        theme_clockwise() +
        theme_showarrows() +
        labs(
          title="Diagramme ternaire",
          T=input$xVar, L=input$yVar, R=input$zVar,
          Tarrow="% X",Larrow="% Y",Rarrow="% Z"
        ) +
        theme(tern.axis.arrow=element_line(linewidth=1,color="black"))
      
      # Générer le diagramme 3
      output$ternaryPlot <- renderPlot({print(base1)})
      
      # Créer le diagramme 3
      base3 <- ggtern(data=df3,aes(L,T,R)) +
        geom_polygon(aes(group=Label3),color="black",alpha=0) +
        geom_text(data=Labs3, aes(label=Label), size=3, color="black") +
        geom_point(data=ma_df, aes(x, y, z), color="red", size=3) +
        theme_bw() +
        theme(plot.title=element_text(hjust=0.5)) +
        tern_limits(labels=c(10,20,30,40,50,60,70,80,90,100), breaks=seq(0.1,1,by=0.1)) +
        theme_clockwise() +
        theme_showarrows() +
        labs(
          title="Diagramme ternaire 3 zones",
          T=input$xVar, L=input$yVar, R=input$zVar,
          Tarrow="% X",Larrow="% Y",Rarrow="% Z"
        ) +
        theme(tern.axis.arrow=element_line(linewidth=1,color="black"))
      
      # Générer le diagramme 3
      output$ternaryPlot3 <- renderPlot({print(base3)})
      
      #Créer le diagramme 4
      base4 <- ggtern(data=df4,aes(L,T,R)) +
        geom_polygon(aes(group=Label4),color="black",alpha=0) +
        geom_text(data=Labs4,aes(label=Label),size=3,color="black") +
        geom_point(data=ma_df, aes(x, y, z), color="red", size=3) +
        theme_bw() +
        theme(plot.title=element_text(hjust=0.5)) +
        tern_limits(labels=c(10,20,30,40,50,60,70,80,90,100),breaks=seq(0.1,1,by=0.1)) +
        theme_clockwise() +
        theme_showarrows() +
        labs(
          title="Diagramme ternaire 4 zones",
          T=input$xVar, L=input$yVar, R=input$zVar,
          Tarrow="% X",Larrow="% Y",Rarrow="% Z"
        ) +
        theme(tern.axis.arrow=element_line(size=1,color="black"))
      
      # Générer le diagramme 4
      output$ternaryPlot4 <- renderPlot({print(base4)})
      
      # Créer le diagramme 10
      base10 <- ggtern(data=df10,aes(L,T,R)) +
        geom_polygon(aes(group=Label10),color="black",alpha=0) +
        geom_text(data=Labs10,aes(label=Label),size=3,color="black") +
        geom_point(data=ma_df, aes(x, y, z), color="red", size=3) +
        theme_bw() +
        theme(plot.title=element_text(hjust=0.5)) +
        tern_limits(labels=c(10,20,30,40,50,60,70,80,90,100),breaks=seq(0.1,1,by=0.1)) +
        theme_clockwise() +
        theme_showarrows() +
        labs(
          title="Diagramme ternaire 10 zones",
          T=input$xVar, L=input$yVar, R=input$zVar,
          Tarrow="% X",Larrow="% Y",Rarrow="% Z"
        ) +
        theme(tern.axis.arrow=element_line(size=1,color="black"))
      
      # Générer le diagramme 10
      output$ternaryPlot10 <- renderPlot({print(base10)})
    }
  
  # Afficher les selectInput dès le chargement du fichier
  output$variableSelectors <- renderUI({
    tagList(
      selectInput("xVar", "Variable x:", choices = colnames(data())),
      selectInput("yVar", "Variable y:", choices = colnames(data())),
      selectInput("zVar", "Variable z:", choices = colnames(data()))
    )
  })
  
  # Afficher le jeu de données dans l'onglet correspondant
  output$dataTable <- renderTable({
    data_selected <- data()
    return(data_selected)
  })
}

shinyApp(ui, server)

Кроме того, можно ли оптимизировать этот скрипт? У меня сложилось впечатление, что он слишком плотный.

Вы можете помочь мне? заранее спасибо

УР

Среди многочисленных попыток изменить скрипт я пытался выяснить, какой «data_selected» изменить, чтобы приложение заработало. Но я не смог найти, в чем проблема.

0 ответов

Другие вопросы по тегам