R闪亮的反应数据子集

时间:2013-12-13 12:10:12

标签: r shiny

在Stackoverflow的精彩人士的帮助下,我设法建立了一个闪亮的网络应用程序(感谢闪亮的服务器开发人员),让我选择要使用的数据集,并绘制一个显示完整数据集的漂亮表格。现在,我希望用户输入日期范围,然后通过按提交按钮显示该范围内的数据表。

提交请求时会显示错误消息:

  

DataTables warning(table id ='DataTables_Table_0'):DataTables   警告:无法解析来自服务器的JSON数据。这是由   一个JSON格式错误。

我认为这不是R错误。我发现了一些有关JSON googleing的信息,但它与之相关 Javascript,我不知道如何管理。我正在使用Firefox来测试应用程序。

请在此处找到我用于 ui.R

的代码
library(shiny)

shinyUI(pageWithSidebar(
  # Título superior
  headerPanel(""),
  # Panel lateral izquierdo - selección de datos
  sidebarPanel(
    selectInput("torre", "Torre:",
                list("Place 1" = "place1",
                     "Place 2" = "place2")),       
    selectInput("tipo", "Intervalo de datos",
                list("Daily" = "-daily.csv",
                     "Monthly" = "-monthly.csv")),
    textInput("date1", "Fecha inicial:", "2000-01-01"),
    textInput("date2", "Fecha final:", "2000-01-01"),
    submitButton("Update View")
  ),

  # Panel principal (presentación de gráficas)
  mainPanel(
    tabsetPanel(
      tabPanel("Inicio",
               h3("Consulta de datos"),
               p(HTML("En el panel <i>Ayuda</i> se describen las variables 
                     presentadas en la tabla de datos.")),
               tableOutput("view")
               ),
      tabPanel("Ayuda", htmlOutput("ayuda"),id="ayuda"),
      tabPanel('Tabla de datos', dataTableOutput("mytable3"))      
    )
  )
))

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({
    paste0(input$date1," 00:00:00")
  })
  day2=reactive({
    paste0(input$date2," 23:50:00")
  })
  # Lectura de datos  
    datos2=reactive({
    read.csv(filename(),header=T, sep=",",na.strings="-99.9")
  })
  datos=reactive({
    d1 <- as.POSIXct(day1())
    d2 <- as.POSIXct(day2())
    with( datos2() , datos2()[ date >= d1 & date <= d2, ] )
  })
  #  Tabla de datos
  output$mytable3 = renderDataTable({
    datos()
  }, options = list(aLengthMenu = c(10, 25, 50), iDisplayLength = 10))
})

感谢您的帮助

EDIT1

还在server.R

中尝试了这段代码
  datos=reactive(function(){
    subset(datos2(),datos2()$date >= day1())
    subset(datos2(),datos2()$date <= day2())
  }) 

和一些变体如

  datos=reactive(function(){
    subset(datos2(),date >= input$date1)
    subset(datos2(),date <= input$date2)
  })

没有成功。在这两种情况下,数据表显示整个数据集,它似乎在更改输入日期后运行,但子集不会生效。

编辑2

数据重新上载,因为ubuntu一个链接被破坏了。请检查标题和格式的数据,因为原始数据已丢失,可能还有一些更改。

您可以在monthlydaily

找到数据

1 个答案:

答案 0 :(得分:3)

在您上传的文件中,只有place2-daily.csv有效。 place1-daily标题已损坏(请使用记事本查看),并且每月根据您的子集要求没有day列。

所以让我们修复文件名:

  datos2=reactive({
    #fn = filename()
    fn = "place2-daily.csv"
    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, ] )
  })

date作为一个因素被读入,因此您必须先将其转换。在datos部分,我建议分配一个局部变量。我的经验法则是每当多次调用()时总是分配。