блестящее приложение: отображает данные на основе отправленных переменных из пользовательского интерфейса на сервер, одной из переменных является дата - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь поменять блестящее приложение здесь , поэтому я добавил два входа на выбор, когда вы хотите построить график данных. Один столбец моих данных - дата. Я не смог отобразить данные. Я попытался скомпоновать поле даты, но это могло быть проблемой с типами переменных ShinyApp, потому что я попытался отобразить данные на отдельном примере, и это сработало. Я заметил, что оригинальный пример использует вставку для форматирования input$x, который отправляется пользовательским интерфейсом на сервер, используя функцию regFormula (). Я пытался изменить структуру и даже избавиться от нее. Все еще с ошибкой. Кроме того, я попытался использовать пакет zoo , который снова работает на отдельном примере, не входящем в приложение.

здесь приведен dput с использованием фрейма данных:

 structure(list(Dead = c(0L, 0L, 0L, 0L, 0L, 1L, 9L, 0L, 0L, 0L
    ), Case = c(120L, 70L, 50L, 40L, 39L, 20L, 18L, 13L, 9L, 2L), Recovered = c(30L, 
    0L, 18L, 13L, 19L, 10L, 0L, 16L, 0L, 1L), Critical = c(0L, 0L, 0L, 
    0L, 8L, 4L, 0L, 3L, 2L, 0L), Date = c("18/03/2020", "17/03/2020", 
    "16/03/2020", "15/03/2020", "14/03/2020", "13/03/2020", "12/03/2020", 
    "11/03/2020", "10/03/2020", "09/03/2020")), class = "data.frame", row.names = c(NA, 
    10L))

if Вы проверяете дату по вышеуказанным данным, используя str(df), поле даты будет иметь тип chr. Даже я пытался перед загрузкой данных использовать as.factor(df$Date), чтобы изменить их, без надежды.

ui.R:

fluidPage(
title = 'Download a PDF report',
 sidebarLayout(
   sidebarPanel(
    helpText(),
    selectInput('x', 'Choose X-axis data',
              choices = names(dataMOH)),
    selectInput('y', 'Choose Y-axis data',
              choices = names(dataMOH)),
    radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'),
                inline = TRUE),
      downloadButton('downloadReport') ),
  mainPanel(
  plotOutput('regPlot')
   )
  )
 )

server.R:

 function(input, output) {
      regFormula <- reactive({
      # as.formula(paste(input$x,'~ Date'))
        as.formula(paste(input$x,input$y))
      })

      output$regPlot <- renderPlot({
        par(mar = c(4, 4, .1, .1)) # margin lines
     #  plot(regFormula(), data = df, pch = 19) #df : dataframe name 
     #  plot(zoo(df$Case,as.Date(df$Date,"%d/%m/%y")))
        plot(zoo(df$(input$y),as.Date(df$(input$x),"%d/%m/%y")))

      })

     output$downloadReport <- downloadHandler(
       filename = function() {
       paste('my-Report', sep = '.', switch(
         input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
       ))
      },

     content = function(file) {
       src <- normalizePath('report.Rmd')
       # temporarily switch to the temp dir, in case you do not have write
       # permission to the current working directory
        owd <- setwd(tempdir())
        on.exit(setwd(owd))
       file.copy(src, 'report.Rmd', overwrite = TRUE)
       library(rmarkdown)
    out <- render('report.Rmd', switch(
      input$format,
      PDF = pdf_document(), HTML = html_document(), Word = word_document()))
   file.rename(out, file)
  }
 )
}

что мне здесь не хватает?

1 Ответ

1 голос
/ 19 марта 2020

Вот пример для тестирования - хотя это может быть полезно для визуализации.

Была добавлена ​​строка для изменения формата Date с as.Date - это можно переместить в reactive выражение, если необходимо преобразование после загрузки файла.

У меня есть два примера, чтобы показать графики - один с regFormula, использующим reformulate для создания функции, а второй использует необязательное выражение reactive в случае Вы хотите выбрать указанные c переменные или выполнить другие манипуляции.

Похоже, вы можете попробовать установить Date по умолчанию. Это можно сделать, используя selected в вашем selectInput.

Надеюсь, это поможет.

library(shiny)

dataMOH$Date = as.Date(dataMOH$Date, format = "%d/%m/%Y")

ui <- fluidPage(
  title = 'Download a PDF report',
  sidebarLayout(
    sidebarPanel(
      helpText(),
      selectInput("x", "Choose X-axis data", choices = names(dataMOH), selected = "Date"),
      selectInput("y", "Choose Y-axis data", choices = names(dataMOH)),
      radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'), inline = TRUE),
      downloadButton('downloadReport')
    ),
    mainPanel(
      tabsetPanel(
       tabPanel("Plot 1", plotOutput("regPlot1")),
       tabPanel("Plot 2", plotOutput("regPlot2"))
      )
    )
  )
)

server <- function(input, output, session) {

  regFormula <- reactive({
   reformulate(termlabels = input$x, response = input$y)
  })

  myData <- reactive({
    dataMOH[, c(input$x, input$y)]
  })

  output$regPlot1 <- renderPlot({
    par(mar = c(4, 4, .1, .1)) # margin lines
    plot(myData())
  })

  output$regPlot2 <- renderPlot({
    par(mar = c(4, 4, .1, .1)) # margin lines
    plot(regFormula(), data = dataMOH)
  })

  output$downloadReport <- downloadHandler(
    filename = function() {
      paste('my-Report', sep = '.', switch(
        input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
      ))
    },

    content = function(file) {
      src <- normalizePath('report.Rmd')
      # temporarily switch to the temp dir, in case you do not have write
      # permission to the current working directory
      owd <- setwd(tempdir())
      on.exit(setwd(owd))
      file.copy(src, 'report.Rmd', overwrite = TRUE)
      library(rmarkdown)
      out <- render('report.Rmd', switch(
        input$format,
        PDF = pdf_document(), HTML = html_document(), Word = word_document()))
      file.rename(out, file)
    }
  )
}

shinyApp(ui, server)

Для plotly графика вам понадобится:

library(plotly)

Вместо plotOutput вам потребуется:

plotlyOutput("regPlot1")

Для одного из участков вы можете указать renderPlotly:

output$regPlot1 <- renderPlotly({
  ggplotly(ggplot(data = myData(), aes_string(x = input$x, y = input$y)) +
             geom_point(size = 1, color = "blue"))
})
...