首页 > 解决方案 > Shiny:在不改变数据的情况下添加回归线

问题描述

我正在编写一个闪亮的应用程序来调整绘图中的散布量。数据是通过生成的rnorm()。我用 显示情节ggplot2。我想根据复选框的值显示或隐藏回归线。这一切都有效。

但是,每当我显示或隐藏回归线(不改变误差量)时,数据都会重新生成,这是我不想要的。我在反应函数中有数据,希望能解决问题,但事实并非如此。

我试过同时使用geom_smoothgeom_abline在代码中注释掉),但都导致数据重新生成。

问题:我可以在不更改数据的情况下添加/删除回归线吗?也就是说,点的位置应仅在滑块更改时更改,而不是复选框。

library(shiny)
library(ggplot2)

set.seed(42)

ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      sliderInput("stdev",
                  "Amount of error:",
                  min = 0,
                  max = 0.8,
                  value = 0.34),
      checkboxInput("showLM", "Show regression line?",
                    value = TRUE)
    ),

    mainPanel(
      plotOutput("regrPlot")
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

  output$regrPlot <- renderPlot({

    regrData <- reactive({
      pl <- rnorm(50, mean = 4.3, sd = 0.44)
      error <- rnorm(length(pl), 0, input$stdev)
      sl <- 2.41 + (0.828 * pl) + error

      tibble(pl, sl)

    })

    # For use with abline
    coefs <- lm(sl ~ pl, data = regrData())$coefficients

    p1 <- ggplot(data = regrData(), aes(x = pl, y = sl)) + 
      geom_point()

    # Try with geom_abline
    # p2 <- {if (input$showLM) p1 + 
    #     geom_abline(slope = coefs[2],
    #                 intercept = coefs[1]) 
    #   else p1}

   p2 <- {if (input$showLM)
     p1 + geom_smooth(method = "lm",
                      se = FALSE)
     else p1}

    print(p2)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

reprex 包(v0.2.1)于 2019 年 1 月 23 日创建

标签: rggplot2shiny

解决方案


这里的问题是你把你放在你的reactive里面renderPlot,这样每次代码renderPlot失效时都会重新运行代码。

相反,您应该将您的reactive外部移动到您的主要server功能中。然后它只会在其值因input$stdev.

ggplot但是,当您添加回归线时,您将始终需要重新渲染。据我所知,如果ggplot不重新渲染整个情节,就无法在 a 中添加一条线。


推荐阅读