Ok - J'ai trouvé comment faire ce dont j'ai besoin. Pour mon premier problème, je voulais l'aspect et la convivialité de 'renderDataTable', mais je voulais tirer dans un cadre de données (renderDataTable / dataTableOutput ne le permet pas, il doit être dans un format de tableau). Pour ce faire, j'ai trouvé une utilisation pratique de ReportingTools (de Bioconductor) et de la façon dont ils le font. Cela vous permet d'utiliser directement un cadre de données tout en ayant le tableau HTML avec les tris, la recherche, la pagination, etc. L'information peut être trouvée ici :
https://bioconductor.org/packages/release/bioc/html/ReportingTools.html
J'en viens maintenant à mon deuxième problème : la mise à jour régulière des données et du tableau sans redémarrer l'application. Cela s'est avéré simple, il m'a juste fallu un peu de temps pour le comprendre, étant nouveau dans Shiny. Une chose à souligner, pour garder cet exemple simple, j'ai utilisé renderTable plutôt que la solution ci-dessus avec le paquet ReportingTools. Je voulais simplement garder cet exemple simple. La première chose que j'ai faite est d'envelopper tout mon code server.R (dans la fonction shinyServer()) dans un observe({}). Ensuite, j'ai utilisé invalidateLater() pour lui dire de se rafraîchir toutes les 5 secondes. Voici le code :
## server.R ##
library(shiny)
library(shinydashboard)
library(DT)
shinyServer(function(input, output, session) {
observe({
invalidateLater(5000,session)
output$PRI1LastPeriodTable <- renderTable({
prioirtyOneIncidentsLastPeriod <- updateILP()
})
})
})
Maintenant, l'original pour la partie renderTable(), j'appelais juste le nom d'objet du fichier .Rdata chargé, mais je voulais qu'il soit lu à chaque fois, donc j'ai créé une fonction dans mon fichier global.R (cela aurait pu être dans server.R) pour charger le fichier. Ce code est ici :
updateILP <- function() {
load(file = "W:/Projects/R/Scripts/ITPOD/itpod/data/prioirtyOneIncidentsLastPeriod.RData", envir = .GlobalEnv)
return(prioirtyOneIncidentsLastPeriod)
}
C'est tout, rien d'autre ne va dans le fichier global.R. Votre fichier ui.R sera configuré comme vous le souhaitez, il appellera tableOutout, dataTableOutput, ou toute autre méthode de rendu dans l'interface utilisateur. Donc, ce qui se passe est que toutes les 5 secondes, le code renderTable() est lu toutes les 5 secondes, ce qui à son tour invoque la fonction qui lit réellement le fichier. J'ai testé cela en apportant des modifications au fichier de données, et la brillante application s'est mise à jour sans aucune interaction de ma part. Cela fonctionne comme un charme.
Si cette méthode est inélégante ou inefficace, faites-moi savoir si elle peut être améliorée, c'était la méthode la plus directe que j'ai trouvée. Merci à tous pour votre aide et vos commentaires !