Shiny

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Shiny

Messagepar Maxime Deniaux » 15 Fév 2022, 15:38

Bonjour,

nouveau sur le forum, je viens solliciter votre aide pour un projet personnel.

Je vous l'explique en quelques mots : je récolte des données sur le foot avec le site https://fbref.com/en/comps/Big5/shooting/players/Big-5-European-Leagues-Stats . Ici, c'est un tableau avec des statistiques sur les joueurs de 5 grands championnats en Europe.

Jusqu'à maintenant, je faisais des graphiques via un fichier script R classique mais je me suis dis que ça avait davantage d'intérêt de créer un tableau de bord avec Shiny. Sauf que je n'en ai jamais fait alors j'ai essayé d'en commencer un en faisant apparaître plusieurs des graphiques que j'avais pu faire jusqu'alors, ce qui a fonctionné d'ailleurs mais je n'avais que très peu de "paramètres réactifs" dans le code, juste le choix d'une base de données dans une liste.
Une fois ce choix fait, j'affichais le graphique.

Donc j'ai voulu ajouter d'autres paramètres réactifs, comme le championnat ou encore le poste du joueur, afin de filtrer la base de données qui sera sélectionnée. J'ai essayé de chercher sur internet via les différents exemple de Shiny en accès libre, ou encore via https://github.com/cmisid/Tutorials/blob/master/R%C3%A9alisation%20d'un%20dashboard%20avec%20RShiny.md sur lequel j'ai tenté de m'inspirer.

Et là...patatra. Ca ne fonctionne plus, j'ai cette erreur :

Code : Tout sélectionner

 Error : 'from' must be a finite number

Je pense que je dois avoir un soucis de syntaxe au niveau du filtrage de ma base de données avec les input. Je ne maitrise pas encore bien ça, notamment où je dois le placer et comment l'écrire, donc j'imagine que mon erreur vient d'ici ?

Je vous met mon code ci-dessous (il y a une "longue" partie de restructuration de la table que vous pouvez normalement passer) :

Code : Tout sélectionner



#J'ai tout un tas de package dans ce code mais tous ne sont peut-être pas nécessaires :

library(shiny)
library(datasets)
library(tidyverse)
library(rvest)
library(XML)
library(dplyr)
library(ggplot2)
library(ggrepel)
library(ggthemes)
library(gridExtra)
library(httr) # Pour la fonction GET
library(XML) # Pour les fonctions htmlParse, et xpathSApply
library(shiny)
library(DT)
library(Factoshiny)
library(FactoMineR)
library(rpart)
library(party)
library(fpc)
library(shinythemes)
library(scales)






# Define UI for application
ui = shinyUI(navbarPage("Statistiques sur le football europeen",theme = shinytheme("superhero"),
                       
                       
                        tabPanel("Viz à 2 indicateurs + joueurs",
                                 
                            sidebarPanel(
                               
                                h3("Filtrage des donnees"),
                               
                                selectInput("Champ", "Choix de la base de donnees :",
                                            choices = c("France",'Allemagne',"Italie","Angleterre","Espagne","Tous_Championnats")),
                                selectInput("Poste","Poste :",
                                            choices = c("Attaquants","Milieux","Defenseurs")),
                                selectInput("Xvar", "Variable X :",
                                            choices = "Nombre_Frappes_par_90min"),
                                selectInput("Yvar", "Variable Y",
                                            choices = "Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus_par_90min")
                                        ),
                           
                            # MainPanel divided into many tabPanel
                            mainPanel(
                                tabsetPanel(
                                   
                                    tabPanel("Plot", plotOutput("simplePlot",height=800)),
                                    tabPanel("Table", tableOutput("view"))
                                   
                                            )
                                    )
                                ),
                       
                       
                        tabPanel("Viz à 1 indicateur + joueurs",
                                 
                                 sidebarPanel(
                                     
                                     h3("Filtrage des donnees"),
                                     
                                     selectInput("dataset2", "Choix de la base de donnees :",
                                                 choices = c("France_Attaquants_Milieux","France_Defenseurs","TOP_5_Championnats")),
                                     selectInput("Var", "Variable :",
                                                 choices = c("Nombre_Frappes_par_90min", "Difference_Entre_Buts_et_Buts_Attendus_Penaltys_Exclus_par_90min"))
                                 ),
                                 # MainPanel divided into many tabPanel
                                 mainPanel(
                                     
                                     tabsetPanel(
                                         
                                         tabPanel("Plot", plotOutput("simplePlot2")),
                                         tabPanel("Table", tableOutput("view2"))
                                         
                                                )
                                          )
                                 )
                         )
                )
               
               

server = function(input, output) {
   

    #importation du tableau de la page shoots top5 championnat europe
    page_frappeurs <- GET("https://widgets.sports-reference.com/wg.fcgi?css=1&site=fb&url=%2Fen%2Fcomps%2FBig5%2Fshooting%2Fplayers%2FBig-5-European-Leagues-Stats&div=div_stats_shooting")
    writeLines(as.character(page_frappeurs), "page_frappeurs.html")
   
    ## Parsing
    frappeurs <- htmlParse("page_frappeurs.html", encoding = "UTF-8")
   
    ## Extraction du tableau
    frappeurs <- readHTMLTable(frappeurs)
    frappeurs=as.data.frame(frappeurs)
   
    #####################                restructuration de la table               #####################
   

    # nom colonnes buguees
    colnames(frappeurs)=str_split(colnames(frappeurs),"stats_shooting.", simplify = TRUE)[,2]
   
    # supression 1ere et derniere colonnes
    frappeurs=frappeurs[,-ncol(frappeurs)]
    frappeurs=frappeurs[,-1]
   
    # suppression lignes bugees
    frappeurs=frappeurs[-(which(frappeurs$Player=="Player")),]
   
    # je garde que la premiere position specifiee car il y en a parfois 2
    frappeurs$Pos=str_split(frappeurs$Pos,",", simplify = TRUE)[,1]
   
    # transformation variable nation
    frappeurs$Nation=str_split(frappeurs$Nation," ", simplify = TRUE)[,2]
   
    # transformation variable nation
    frappeurs$Comp=paste(str_split(frappeurs$Comp," ", simplify = TRUE)[,2],str_split(frappeurs$Comp," ", simplify = TRUE)[,3],sep=" ")
   
    # transformation variable age
    frappeurs$Age=str_split(frappeurs$Age,"-",simplify = TRUE)[,1]
   
    # transformation variable noms joueurs
    frappeurs$Player[which(str_split(frappeurs$Player, " ", simplify = TRUE)[,4]!="")]=str_split(frappeurs$Player, " ", simplify = TRUE)[which(str_split(frappeurs$Player, " ", simplify = TRUE)[,4]!=""),4]
    frappeurs$Player[which(str_split(frappeurs$Player, " ", simplify = TRUE)[,3]!="")]=str_split(frappeurs$Player, " ", simplify = TRUE)[which(str_split(frappeurs$Player, " ", simplify = TRUE)[,3]!=""),3]
    frappeurs$Player[which(str_split(frappeurs$Player, " ", simplify = TRUE)[,2]!="")]=str_split(frappeurs$Player, " ", simplify = TRUE)[which(str_split(frappeurs$Player, " ", simplify = TRUE)[,2]!=""),2]
   
   
    #caracteres speciaux a changer dans les noms des joueurs
    frappeurs$Player=gsub("é","e",frappeurs$Player)
    frappeurs$Player=gsub("Ã\u009c","U",frappeurs$Player)
    frappeurs$Player=gsub("ı","i",frappeurs$Player)
    frappeurs$Player=gsub("á","a",frappeurs$Player)
    frappeurs$Player=gsub("é","e",frappeurs$Player)
    frappeurs$Player=gsub("é","e",frappeurs$Player)
    frappeurs$Player=gsub("ña","na",frappeurs$Player)
    frappeurs$Player=gsub("ü","u",frappeurs$Player)
    frappeurs$Player=gsub("ó","ó",frappeurs$Player)
    frappeurs$Player=gsub("Ã\u0081","Al",frappeurs$Player)
    frappeurs$Player=gsub("ñ","n",frappeurs$Player)
    frappeurs$Player=gsub("ø","a",frappeurs$Player)
    frappeurs$Player=gsub("Ä\u0087","c",frappeurs$Player)
    frappeurs$Player=gsub("Ã","i",frappeurs$Player)
    frappeurs$Player=gsub("Å¡i","si",frappeurs$Player)
    frappeurs$Player=gsub("i°","o",frappeurs$Player)
    frappeurs$Player=gsub("Å\u0084","n",frappeurs$Player)
    frappeurs$Player=gsub("i«","e",frappeurs$Player)
    frappeurs$Player=gsub("Ä\u0086","c",frappeurs$Player)
    frappeurs$Player=gsub("Å\u0082","l",frappeurs$Player)
    frappeurs$Player=gsub("i\u0087","c",frappeurs$Player)
    frappeurs$Player=gsub("Ä\u009f","g",frappeurs$Player)
    frappeurs$Player=gsub("i£","a",frappeurs$Player)
    frappeurs$Player=gsub("i¶","o",frappeurs$Player)
    frappeurs$Player=gsub("Ä\u008","c",frappeurs$Player)
    frappeurs$Player=gsub("Ä\u0085","a",frappeurs$Player)
    frappeurs$Player=gsub("e\u0099","s",frappeurs$Player)
    frappeurs$Player=gsub("Ä\u0083","a",frappeurs$Player)
    frappeurs$Player=gsub("iº","u",frappeurs$Player)
    frappeurs$Player=gsub("ž","z",frappeurs$Player)
    frappeurs$Player=gsub("i\u0089","e",frappeurs$Player)
    frappeurs$Player=gsub("i¨","e",frappeurs$Player)
   
   
   
   
   
   
   
    #caracteres speciaux a changer dans les equipes des joueurs
    frappeurs$Squad=gsub("é","e",frappeurs$Squad)
    frappeurs$Squad=gsub("Ã\u009c","U",frappeurs$Squad)
    frappeurs$Squad=gsub("ı","i",frappeurs$Squad)
    frappeurs$Squad=gsub("á","a",frappeurs$Squad)
    frappeurs$Squad=gsub("é","e",frappeurs$Squad)
    frappeurs$Squad=gsub("é","e",frappeurs$Squad)
    frappeurs$Squad=gsub("ña","na",frappeurs$Squad)
    frappeurs$Squad=gsub("ü","u",frappeurs$Squad)
    frappeurs$Squad=gsub("ó","ó",frappeurs$Squad)
    frappeurs$Squad=gsub("Ã\u0081","Al",frappeurs$Squad)
    frappeurs$Squad=gsub("ñ","n",frappeurs$Squad)
    frappeurs$Squad=gsub("ø","a",frappeurs$Squad)
    frappeurs$Squad=gsub("Ä\u0087","c",frappeurs$Squad)
    frappeurs$Squad=gsub("Ã","i",frappeurs$Squad)
    frappeurs$Squad=gsub("Å¡i","si",frappeurs$Squad)
    frappeurs$Squad=gsub("i°","o",frappeurs$Squad)
    frappeurs$Squad=gsub("Å\u0084","n",frappeurs$Squad)
    frappeurs$Squad=gsub("i«","e",frappeurs$Squad)
    frappeurs$Squad=gsub("Ä\u0086","c",frappeurs$Squad)
    frappeurs$Squad=gsub("Å\u0082","l",frappeurs$Squad)
    frappeurs$Squad=gsub("i\u0087","c",frappeurs$Squad)
    frappeurs$Squad=gsub("Ä\u009f","g",frappeurs$Squad)
    frappeurs$Squad=gsub("i£","a",frappeurs$Squad)
    frappeurs$Squad=gsub("i¶","o",frappeurs$Squad)
    frappeurs$Squad=gsub("Ä\u008","c",frappeurs$Squad)
    frappeurs$Squad=gsub("Ä\u0085","a",frappeurs$Squad)
    frappeurs$Squad=gsub("e\u0099","s",frappeurs$Squad)
    frappeurs$Squad=gsub("Ä\u0083","a",frappeurs$Squad)
    frappeurs$Squad=gsub("iº","u",frappeurs$Squad)
    frappeurs$Squad=gsub("ž","z",frappeurs$Squad)
    frappeurs$Squad=gsub("i\u0089","e",frappeurs$Squad)
    frappeurs$Squad=gsub("i¨","e",frappeurs$Squad)
   
   
    # Nom colonnes
    colnames(frappeurs)=c("Joueur","Nationnalite","Position_Joueur","Equipe","Championnat","Age",
                          "Naissance","Temps_de_jeu_en_minutes","Nombre_Buts","Nombre_Frappes","Nombre_Frappes_Cadrees",
                          "Pourcentage_Frappes_Cadrees","Nombre_Frappes_par_90min","Nombre_Frappes_Cadrees_par_90min",
                          "Nombre_Buts_par_Frappe","Nombre_Buts_par_Frappes_Cadree","Distance_Moyenne_Frappes",
                          "Frappes_sur_CPA","Nombre_Penalty_Marques","Nombre_Penalty_Tentes","Nombre_Buts_Attendus",
                          "Nombre_Buts_Attendus_Penalty_Exclus","Nombre_Buts_Attendus_Penalty_Exclus_par_Frappe",
                          "Difference_Entre_Buts_et_Buts_Attendus","Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus")
   
   
   
    # type variables
   
    frappeurs$Age=as.numeric(frappeurs$Age)
    frappeurs$Naissance=as.numeric(frappeurs$Naissance)
    frappeurs$Temps_de_jeu_en_minutes=as.numeric(frappeurs$Temps_de_jeu_en_minutes)
    frappeurs$Nombre_Buts=as.numeric(frappeurs$Nombre_Buts)
    frappeurs$Nombre_Frappes=as.numeric(frappeurs$Nombre_Frappes)
    frappeurs$Nombre_Frappes_Cadrees=as.numeric(frappeurs$Nombre_Frappes_Cadrees)
    frappeurs$Pourcentage_Frappes_Cadrees=as.numeric(frappeurs$Pourcentage_Frappes_Cadrees)
    frappeurs$Nombre_Frappes_par_90min=as.numeric(frappeurs$Nombre_Frappes_par_90min)
    frappeurs$Nombre_Frappes_Cadrees_par_90min=as.numeric(frappeurs$Nombre_Frappes_Cadrees_par_90min)
    frappeurs$Nombre_Buts_par_Frappe=as.numeric(frappeurs$Nombre_Buts_par_Frappe)
    frappeurs$Nombre_Buts_par_Frappes_Cadree=as.numeric(frappeurs$Nombre_Buts_par_Frappes_Cadree)
    frappeurs$Distance_Moyenne_Frappes=as.numeric(frappeurs$Distance_Moyenne_Frappes)
    frappeurs$Frappes_sur_CPA=as.numeric(frappeurs$Frappes_sur_CPA)
    frappeurs$Nombre_Penalty_Marques=as.numeric(frappeurs$Nombre_Penalty_Marques)
    frappeurs$Nombre_Penalty_Tentes=as.numeric(frappeurs$Nombre_Penalty_Tentes)
    frappeurs$Nombre_Buts_Attendus=as.numeric(frappeurs$Nombre_Buts_Attendus)
    frappeurs$Nombre_Buts_Attendus_Penalty_Exclus=as.numeric(frappeurs$Nombre_Buts_Attendus_Penalty_Exclus)
    frappeurs$Nombre_Buts_Attendus_Penalty_Exclus_par_Frappe=as.numeric(frappeurs$Nombre_Buts_Attendus_Penalty_Exclus_par_Frappe)
    frappeurs$Difference_Entre_Buts_et_Buts_Attendus=as.numeric(frappeurs$Difference_Entre_Buts_et_Buts_Attendus)
 frappeurs$Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus=as.numeric(frappeurs$Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus)
   
   
    # remplacement des NA des variables numeriques
    frappeurs$Pourcentage_Frappes_Cadrees[which(is.na(frappeurs$Pourcentage_Frappes_Cadrees))]=0
    frappeurs$Nombre_Buts_par_Frappes_Cadree[which(is.na(frappeurs$Nombre_Buts_par_Frappes_Cadree))]=0
    frappeurs$Nombre_Buts_par_Frappe[which(is.na(frappeurs$Nombre_Buts_par_Frappe))]=0
    frappeurs$Distance_Moyenne_Frappes[which(is.na(frappeurs$Distance_Moyenne_Frappes))]=0
    frappeurs$Nombre_Buts_Attendus_Penalty_Exclus_par_Frappe[which(is.na(frappeurs$Nombre_Buts_Attendus_Penalty_Exclus_par_Frappe))]=0
   
   
    # transformation variable temps jeu
    frappeurs$Temps_de_jeu_en_minutes=frappeurs$Temps_de_jeu_en_minutes*90
   
   
   
   
    # creation de la variable npG (no penalty goal)
    frappeurs$Nombre_Buts_Penalty_Exclus=frappeurs$Nombre_Buts-frappeurs$Nombre_Penalty_Marques
   
    # creation de la variable npG_90min (no penalty goal par 90 min)
    frappeurs$Nombre_Buts_Penalty_Exclus_par_90min=frappeurs$Nombre_Buts_Penalty_Exclus*90/frappeurs$Temps_de_jeu_en_minutes
   
    # creation de la variable npxG_90min (no penalty expected goal par 90min)
    frappeurs$Nombre_Buts_Attendus_Penalty_Exclus_par_90min=frappeurs$Nombre_Buts_Attendus_Penalty_Exclus*90/frappeurs$Temps_de_jeu_en_minutes
   
    # creation de la variable Diff_npxG_90min_npG_90min
    frappeurs$Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus_par_90min=frappeurs$Nombre_Buts_Penalty_Exclus_par_90min - frappeurs$Nombre_Buts_Attendus_Penalty_Exclus_par_90min
   
    names(frappeurs)[29]="Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus_par_90min"
   
   
    #####################################       Fin restructuration table     ##########################################
   
   
   
    Champ <- reactive({
       
        switch(input$Champ,
               "France" = names(table(frappeurs$Championnat))[3],
               "Allemagne" = names(table(frappeurs$Championnat))[1],
               "Italie" = names(table(frappeurs$Championnat))[5],
               "Angleterre" = names(table(frappeurs$Championnat))[4],
               "Espagne" = names(table(frappeurs$Championnat))[2],
               "Tous_Championnats"= names(table(frappeurs$Championnat))
        )
    })
   
   
   
    poste_joueur <- reactive({
       
        switch(input$Poste,
               "Attaquants" = names(table(frappeurs$Position_Joueur))[2],
               "Milieux" = names(table(frappeurs$Position_Joueur))[4],
               "Defenseurs" = names(table(frappeurs$Position_Joueur))[1])
    })
   
   
   
   
    colX <- reactive({
       
        switch(input$Xvar,
               "Nombre_Frappes_par_90min" = frappeurs$Nombre_Frappes_par_90min)
    })
   
   
   
    colY <- reactive({
       
        switch(input$Yvar,
               "Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus_par_90min" = frappeurs$Difference_Entre_Buts_et_Buts_Attendus_Penalty_Exclus_par_90min)
    })
   

   
   
    output$simplePlot <- renderPlot({
       
        # génération de la table à utiliser
       MaTable = frappeurs %>%
                    arrange(desc(Temps_de_jeu_en_minutes)) %>%
                    filter(Position_Joueur == input$Poste) %>%
                    filter(Championnat %in% input$Champ) %>%
                    filter(Temps_de_jeu_en_minutes >= Temps_de_jeu_en_minutes[1]*0.55) %>%
                    arrange(Joueur)
       
       
        ggplot(MaTable,aes(x=!!sym(input$Xvar), y=!!sym(input$Yvar),color=input$Champ ) ) +
           
            geom_point(size=2.25) +
           
            ggtitle("Efficacite offensive des milieux et attaquants de ligue 1 en fonction \nde leur nombre de frappe par 90min (joueurs ayant au moins 50% du temps de jeu du joueur ayant le plus joue)") +
            ylab ("Difference entre (les buts et les buts attendus) \n par 90 min (penaltys exclus)\n") +
            xlab("\nNombre de frappes tentees par 90min \n\n Auteur : DENIAUX Maxime \n Source donnees : fbref.com ")  +
           
            scale_y_continuous(breaks=seq(floor(quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[1]]*10)/10,
                                          ceiling(quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[21]]*10)/10,0.05),
                               limits = c(floor(quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[1]]*10)/10,
                                          ceiling(quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[21]]*10)/10)) +
           
            scale_x_continuous(breaks = seq(0,ceiling(quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[21]]),0.5),
                               limits = c(0,ceiling(quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[21]]))) +
           
            theme_stata() + theme(axis.title.y = element_text(size = 18),
                                  axis.title.x = element_text(size = 18),
                                  title = element_text(size = 16),
                                  axis.text.y = element_text(angle=0),
                                  legend.position = c(0.95,0.135),
                                  legend.title = element_text(size = 14) ) +
           
            scale_color_stata() +
           
            geom_text_repel(aes(label=ifelse(!!sym(input$Xvar) < quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[6]] & !!sym(input$Yvar) > quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[16]],Joueur,
                                             ifelse(!!sym(input$Xvar) > quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[16]] & !!sym(input$Yvar) < quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[6]],Joueur,
                                                    ifelse(!!sym(input$Xvar) > quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[16]] & !!sym(input$Yvar) > quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[16]],Joueur,
                                                           ifelse(!!sym(input$Xvar) < quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[6]] & !!sym(input$Yvar) < quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[6]],Joueur,
                                                                  ifelse((!!sym(input$Yvar) <= quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[2]]) | (!!sym(input$Yvar) >= quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[20]]) | (!!sym(input$Xvar) <= quantile(frappeurs[,input$Xvar],probs = seq(0, 1, 0.05))[[2]]) |(!!sym(input$Xvar) >= quantile(frappeurs[,input$Xvar],probs = seq(0, 1, 0.05))[[20]]),Joueur,""
                                                                )
                                                         )
                                                  )
                                           )
                                    )
            )
            , size=5) +
           
            geom_hline(yintercept=0, linetype="dashed", color = "red") +
            geom_vline(xintercept=mean(MaTable[,input$Xvar]), linetype="dashed", color = "red") +
           
            annotate(geom="text", x=0.25*quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[11]],
                     y=1.2*quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[21]],
                     label="Tente peu mais est efficace",color="chartreuse4",size=5) +
           
            annotate(geom="text", x=1.75*quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[11]],
                     y=1.25*quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[1]],
                     label="Tente beaucoup mais n'est pas efficace",color="blue",size=5) +
           
            annotate(geom="text", x=0.25*quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[11]],
                     y=1.25*quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[1]],
                     label="Tente peu mais n'est pas efficace",color="darkorange2",size=5) +
           
            annotate(geom="text", x=1.75*quantile(MaTable[,input$Xvar],probs = seq(0, 1, 0.05))[[11]],
                     y=1.2*quantile(MaTable[,input$Yvar],probs = seq(0, 1, 0.05))[[21]],
                     label="Tente beaucoup \n mais est efficace",color="magenta3",size=5) +
           
            annotate(geom="text", x=summary(MaTable[,input$Xvar])[[4]]+0.15,
                     y=summary(MaTable[,input$Yvar])[[6]]+0.15,
                     label="Moyenne",color="red",size=3.5) +
           
            annotate(geom="text", x=summary(MaTable[,input$Xvar])[[6]]+0.75,
                     y=summary(MaTable[,input$Yvar])[[4]]+0.025,
                     label="Moyenne",color="red",size=3.5)
    })
   
   
    output$view <- renderTable({
       
        MaTable = frappeurs %>%
            arrange(desc(Temps_de_jeu_en_minutes)) %>%
            filter(Position_Joueur == input$Poste) %>%
            filter(Championnat %in% input$Champ) %>%
            filter(Temps_de_jeu_en_minutes >= Temps_de_jeu_en_minutes[1]*0.55) %>%
            arrange(Joueur)
       
        arrange(MaTable[,c("Joueur",input$Xvar,input$Yvar,"Nombre_Buts","Equipe")],desc(!!sym(input$Yvar)))
       
    })
   
}


# Run the application
shinyApp(ui = ui, server = server)

               


J'ai essayé de mettre dans mon ggplot MaTable() plutôt que MaTable mais sans succès.

Sur la partie Annotate, il y a des trucs qui ne s'afficheront pas bien selon les graphiques. C'est normal parce que je suis passé d'un code pour chaque graphique (script R) à un seul code pour n'importe quel graphique donc j'ai encore des réglages à effectuer pour que tout s'affiche correctement peut importe les paramètres choisis.

Donc si je récapitule, sur Shiny j'ai une erreur sur la partie "Plot" : Error : 'from' must be a finite number, et une table vide sur ma partie "Table"

Voilà, j'espère que vous pourrez m'aider, c'est un projet qui me tient à coeur et j'aimerais vraiment pouvoir réussir à sortir un tableau de bord sur ça.
Je suis à votre disposition si vous avez des questions.

Je vous remercie.

Maxime

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Shiny

Messagepar Gabriel Terraz » 15 Fév 2022, 16:03

Bonjour,

Je n'ai pas du tout lu ton code mais je me demande si par hasard tu n'aurais pas un paramètre d'input sous forme de caractère et que tu utilises comme nombre ?

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Shiny

Messagepar Maxime Deniaux » 15 Fév 2022, 16:32

Gabriel Terraz a écrit :Bonjour,

Je n'ai pas du tout lu ton code mais je me demande si par hasard tu n'aurais pas un paramètre d'input sous forme de caractère et que tu utilises comme nombre ?


Bonjour,

merci pour ta réponse. J'ai regardé une nouvelle fois mon code.
J'en n'ai pas l'impression, mais peut-être que tu as raison et je ne le vois pas à cause du fait que je débute dans ce type de syntaxe.

Quand j'utilise input$quelquechose, et que derrière c'est en réalité du numérique, je place !!sym devant input$quelquechose. D'après ce que j'ai compris ça règle ce problème mais je ne vois pas ailleurs dans mon code où est-ce que je pourrai avoir un imput de forme character et que j'utilise comme nombre alors que je ne le veux pas.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Shiny

Messagepar Mickael Canouil » 16 Fév 2022, 09:41

Bonjour,

sym ne fait pas du tout ce que vous pensez, il est toujours bon de se référer à documentation des fonctions qu'on ne connait pas https://rlang.r-lib.org/reference/sym.html

Un simple moyen de tester l'hypothèse de Gabriel, est d'ajouter un un message à afficher dans le terminal quand l'application tourne.
Le message doit se trouver côté serveur dans un environnement réactif qui utilise input$something ou dans un observeEvent par exemple (https://shiny.rstudio.com/reference/shi ... Event.html)

Code : Tout sélectionner

message(sprintf("%s is of type %s"input$somethingtypeof(input$something)) 


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Shiny

Messagepar Pierre-Yves Berrard » 16 Fév 2022, 12:44

Un browser() judicieusement inséré dans le code pourrait aussi aider à débuguer.
PY

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Shiny

Messagepar Maxime Deniaux » 16 Fév 2022, 14:51

Merci pour vos réponses.

Pierre-Yves Berrard a écrit :Un browser() judicieusement inséré dans le code pourrait aussi aider à débuguer.

Oui j'avais vu cette fonction et j'avais essayé de l'utiliser mais je n'avais pas réussi à bien comprendre son fonctionnement. Je vais essayer de trouver un autre tutoriel pour réussir à l'utiliser.

Mickael Canouil a écrit :Bonjour,

sym ne fait pas du tout ce que vous pensez, il est toujours bon de se référer à documentation des fonctions qu'on ne connait pas https://rlang.r-lib.org/reference/sym.html

Un simple moyen de tester l'hypothèse de Gabriel, est d'ajouter un un message à afficher dans le terminal quand l'application tourne.
Le message doit se trouver côté serveur dans un environnement réactif qui utilise input$something ou dans un observeEvent par exemple (https://shiny.rstudio.com/reference/shi ... Event.html)

Code : Tout sélectionner

message(sprintf("%s is of type %s", input$something, typeof(input$something)) 


Cordialement,


Je me suis peut-être mal exprimé sur !!sym. Mais de ce que j'en avais lu ici (https://stackoverflow.com/questions/57136322/what-does-the-operator-mean-in-r-particularly-in-the-context-symx), je pensais qu'il y était dit que cette expression permettait d'avoir accès aux données "cachées" derrière un objet de type character.

Je vais regarder pour votre proposition, merci. Je vous tiens au courant

Bonne fin de journée


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité