在 R 中使用 shiny 绘制反应散点图

develop reactive scatter plot using shiny in R

我有四个变量的 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)

我正在尝试学习闪亮的应用程序。我希望我的应用程序在给定年份绘制一个变量与另一个变量的对比图 例如如果用户选择 ab 以及 2001 年,则绘制 ab 的 2001 年。 如果为 2003 年选择了 bc,则绘制 2003 年的 bc,依此类推。 如果为给定年份选择了单个变量或超过 2 个变量,也不要执行任何操作。

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)

这段代码不完整,我希望能得到一些关于如何开发代码的服务器部分的帮助。

我将服务器代码更新为您想要的样子。

pt1 应该要求过滤数据以防止警告。

input$a 不是 return "a" 而是 TRUE - 因此要过滤 a,您可以在复选框选项 a、b 中包含类似向量的内容、c 和 d 以及基于输入的子集(见下文)。它还会检查以确保只选中了 2 个复选框(总和为 2)。根据您的需要,这一切都可以简化。您可能想要包含 checkboxGroupInput 而不是 return 选择的字符向量。

由于您可以将多个复选框组合到 a 到 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])
    }
  })
}