J'ai une application brillante qui montre une belle table html de mes données, en utilisant renderDataTable
. Ensuite, j'ai voulu faire des statistiques de base, des données de sous-ensemble et calculer des moyennes et d'autres données.
Lors de l'affichage des résultats avec renderTable
, j'ai trouvé que la colonne date n'était pas affichée au format date. Dans la figure, vous pouvez voir la différence. Les deux tables sont générées à partir du même ensemble de données dans la même application Web brillante. Pouvez-vous expliquer ce qui se passe?
Et ici, vous pouvez voir ui.R et server.R. Dans ce script, je veux juste montrer un tableau et j'ai été surpris par les différentes sorties.
i.R
library(shiny)
# Estructura de la página (paneles)
shinyUI(pageWithSidebar(
# Título superior
headerPanel(""),
# Panel lateral izquierdo - selección de datos
sidebarPanel(
helpText("Selecciona las fechas y el tipo de datos.
Pulsa el botón Actualizar."),
selectInput("torre", "Torre:",
list("Agres" = "mariola",
"Alfàs del Pi" = "shelada",
"Altura" = "altura",
"Vistabella del Maestrat" = "vistabella",
"Xàtiva" = "xativa")),
selectInput("tipo", "Intervalo de datos",
list("Diezminutales" = "-datos-10m.csv",
"Diarios" = "-datos-diarios.csv",
"Mensuales" = "-datos-mensuales.csv")),
dateInput('date1',
label = 'Fecha inicial',
value = Sys.Date()),
dateInput('date2',
label = 'Fecha final.',
value = Sys.Date()),
submitButton("Actualizar"),
helpText("
Descarga de datos tabulados en formato CSV."),
downloadButton('downloadData','Descargar datos')
),
# Panel principal (presentación de gráficas)
mainPanel(
tabsetPanel(
tabPanel("Inicio",
h3("Consulta de datos"),
p(HTML("Some info.")),
tableOutput("view")
),
tabPanel("Ayuda", htmlOutput("ayuda"),id="ayuda"),
tabPanel('Tabla de datos', dataTableOutput("table1")),
tabPanel('Medias', tableOutput("table2"))
)
)
))
et server.R
library(shiny)
library(plyr)
library(lubridate)
library(scales)
options(shiny.transcode.json = FALSE)
# Funciones
shinyServer(function(input,output){
filename=reactive({
paste0(input$torre,input$tipo)
})
day1=reactive({
as.POSIXct(input$date1)
})
day2=reactive({
as.POSIXct(input$date2)
})
# Ayuda
introFile <- './ayuda.txt'
ayuda <- readChar(introFile, file.info(introFile)$size)
output$ayuda <- renderText({HTML(ayuda)})
datos2=reactive({
fn = filename()
f = read.csv(fn,header=T, sep=",",na.strings="-99.9")
f$date = as.Date(f$date)
f
})
datos=reactive({
d1 <- as.Date(day1())
d2 <- as.Date(day2())
datos2a = datos2()
with( datos2a , datos2a[ date >= d1 & date <= d2, ] )
})
# Tabla de datos
output$table1 = renderDataTable({
datos()
}, options = list(aLengthMenu = c(12, 20, 40), iDisplayLength = 12))
output$table2 = renderTable({
datos()
})
output$downloadData <- downloadHandler(
file = c('data.csv'),
content = function(file) {
write.csv(datos(), file)
}
)
})
Merci d'avance pour votre aide
Il n'y a aucune raison d'avoir la même sortie à partir de 2 fonctions différentes.
rendertable
utilise xtable
pour créer la table htmlrenderDataTable
utilise une bibliothèque javascript externeVous pouvez obtenir le même format de date, vous devez simplement formater votre date avant d'appeler renderTable
. Voici un court exemple complet.
library(shiny)
dat <- data.frame(date=seq.Date(Sys.Date(),by=1,length.out=5),
temp = runif(5))
ui <- fluidPage(
fluidRow(column(4,dataTableOutput('dto')),
column(4,tableOutput('to')))
)
server <- function(input,output){
output$dto <- renderDataTable({dat})
dat$date <- format(dat$date,'%Y-%m-%d')
output$to <- renderTable(dat)
}
runApp(list(ui=ui,server=server))