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