разработать график реактивного рассеяния с использованием блеска в R - PullRequest
0 голосов
/ 04 ноября 2019

У меня за 10 лет данные четырех переменных. Вот как выглядят данные

dat <- data.frame(year = rep(2001:2010, each = 50),
                  a = rnorm(50), b = rnorm(50), c = rnorm(50), d = rnorm(50))

dat_l <- tidyr::gather(dat, variable, value, a:d)

Я пытаюсь освоить блестящее приложение. Я хочу, чтобы мое приложение построило одну переменную относительно другой для данного года. Например, если пользователь выбирает a и b и 2001 год, график a против b для 2001 года. Если b и c выбрано для 2003 года, участок b против c для 2003 года и так далее. Также не делайте ничего, если для данного года выбрана одна переменная или более двух переменных.

library(shiny)

u <- fluidPage(
     titlePanel('My analytics'),
     sidebarLayout(position = 'left',
                   sidebarPanel(
                   checkboxInput('a', 'aRef', value = F),
                    checkboxInput('b', 'bRef', value = F),
                    checkboxInput('c', 'cRef', value = F),
                    checkboxInput('d', 'dRef', value = F),
                    sliderInput('yearRef','Select Year',min=2001,max=2010,value=1)
                  ),

                  mainPanel(
                    tabsetPanel(
                      tabPanel('Scatter', plotOutput(outputId = 'scatter'))
                    )
                  )
    )
  )


  s <- shinyServer(function(input, output) 
  {
    pt1 <- reactive({
      if (!input$a) return(NULL)
      pdata <- dplyr::filter(dat_l, variable == input$a and year == input$yearRef)
      plot(pdata$value, pdata$value)
    })
    output$scatter = renderPlot({pt1})
  })


shinyApp(u,s)

Этот код неполон, и я надеюсь, что смогу получить некоторую помощь по разработке серверной части кода.

1 Ответ

0 голосов
/ 05 ноября 2019

Я обновил код сервера до того, что похоже на то, что вы намереваетесь.

pt1 должен требовать то, что вам нужно для фильтрации ваших данных, чтобы предотвратить предупреждения.

input$a невернуть «a», но вместо этого TRUE - поэтому для фильтрации по a вы можете включить что-то вроде вектора с вашими флажками a, b, c и d и подмножество на основе входных данных (см. ниже). Он также проверяет, установлены ли только 2 флажка (сумма равна 2). В зависимости от ваших потребностей все это может быть упрощено. Возможно, вы захотите включить checkboxGroupInput вместо этого, который вместо этого будет возвращать символьный вектор выборов.

Поскольку вы можете иметь комбинацию из нескольких флажков для сквозного d, используйте %in% вместо ==.

output$scatter получит отфильтрованные данные, вызвав реактивную функцию pt1. Он определит, какие 2 переменные присутствуют в подмножестве данных, и отобразит график 1 в сравнении с другими.

Надеюсь, это полезно.

s <- function(input, output) {
  pt1 <- reactive({
    req(input$yearRef)
    if (sum(input$a, input$b, input$c, input$d) == 2) {
      dplyr::filter(dat_l, variable %in% c("a"[input$a], "b"[input$b], "c"[input$c], "d"[input$d]) & 
                    year == input$yearRef)
    } else {
      return(NULL)
    }
  })

  output$scatter = renderPlot({
    pdata <- pt1()
    pvars <- unique(pdata$variable)
    if (!is.null(pdata)) {
      plot(pdata[pdata$variable == pvars[1], ]$value,
           pdata[pdata$variable == pvars[2], ]$value,
           xlab = pvars[1], ylab = pvars[2])
    }
  })
}
...