【问题标题】:Add a regression line to my scatterplot in r shiny在 r shiny 中向我的散点图添加回归线
【发布时间】:2019-12-11 18:21:35
【问题描述】:

所以我构建了一个闪亮的应用程序,它允许您根据数据集中的变量的任意组合创建散点图。它还在单独的选项卡上输出回归模型的摘要。

基本上我想要一个选项来向我的散点图中添加一条回归线。这将基于从 UI 中选择的输入来创建散点图。我做了一些尝试,但没有成功。这是我到目前为止的工作代码:

  pageWithSidebar(
    titlePanel("Plotting weather trends 2010 - 2014"),
    sidebarPanel(
      selectInput("xCol", "Please select an x variable", names(DF2)),
      selectInput("yCol", "Please select a y variable", names(DF2)),
      checkboxInput("line", "Show regression line?", value = TRUE),
      selectInput("plot_type", "Select a secodary plot for X variable", choices = c("Boxplot", "Histogram"))),
    mainPanel(tabsetPanel(type = "tabs",
                          tabPanel("Plots", (plotOutput("plot1")), plotOutput("plot2")),
                          tabPanel("Regression Model Summary", verbatimTextOutput(outputId = "RegSum"))
    )
    )
  ))


server = function(input, output){ 

  DF3 = reactive({DF2[, c(input$xCol, input$yCol)]})



  output$plot1 = renderPlot({plot(DF3(),
                                  main = "Histogram of select variables")})



  output$plot2 = renderPlot({ 
    if (input$plot_type == "Boxplot") {boxplot(DF2[,input$xCol], main = "boxplot of X variable")}
    if (input$plot_type == "Histogram") {hist(as.numeric(unlist(DF2[,input$xCol])),main = "Histogram of X variable", xlab = "X variable")}
  })

  lm1 <- reactive({lm(reformulate(input$xCol, input$yCol), data = DF2)})
  output$RegSum <- renderPrint({summary(lm1())})

}

shinyApp(ui = ui, server = server)

之前的尝试包括添加一个 abline(lm) 函数以获取来自 UI 的输入,但无济于事。

任何帮助将不胜感激。

【问题讨论】:

  • 下次请提供一个可重现的最小示例。这使其他人更容易理解您的情况。

标签: r shiny regression


【解决方案1】:

abline 的方法是正确的。我猜你的问题是你如何指定lm 函数:如果用户选择两个变量“xCol”和“yCol”,它们会在引号中传递给闪亮的服务器。但是,lm 函数需要y ~ x 形式的公式表示法。为了解决这个问题,我会写lm(get(input$yCol) ~ get(input$xCol), data=DF3())。这样 R 在数据集中而不是全局环境中搜索。

这是一个基于内置 mtcars 数据集的可重现示例:

library(shiny)

ui <- fluidPage(
  selectInput("xCol", "Please select an x variable", names(mtcars)),
  selectInput("yCol", "Please select a y variable", names(mtcars)),
  checkboxInput("line", "Show regression line?", value = TRUE),
  plotOutput("plot")
)

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

  data <- reactive({mtcars[, c(input$xCol, input$yCol)]})

  output$plot <- renderPlot({
    plot(data())
    if(input$line) {
      model <- lm(get(input$yCol) ~ get(input$xCol), data=data())
      abline(model)
    }
  })
}

shinyApp(ui, server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2016-02-24
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多