r - Shiny:在不改变数据的情况下添加回归线
问题描述
我正在编写一个闪亮的应用程序来调整绘图中的散布量。数据是通过生成的rnorm()
。我用 显示情节ggplot2
。我想根据复选框的值显示或隐藏回归线。这一切都有效。
但是,每当我显示或隐藏回归线(不改变误差量)时,数据都会重新生成,这是我不想要的。我在反应函数中有数据,希望能解决问题,但事实并非如此。
我试过同时使用geom_smooth
(geom_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 日创建
解决方案
这里的问题是你把你放在你的reactive
里面renderPlot
,这样每次代码renderPlot
失效时都会重新运行代码。
相反,您应该将您的reactive
外部移动到您的主要server
功能中。然后它只会在其值因input$stdev
.
ggplot
但是,当您添加回归线时,您将始终需要重新渲染。据我所知,如果ggplot
不重新渲染整个情节,就无法在 a 中添加一条线。
推荐阅读
- azure - 当子项包含空数组时,Azure CosmosDB sql join 不返回结果
- c# - Entity Framework Core 同模型中的父子项,子节点返回null
- python - Python的`struct`字节大小计算
- r - 如何根据另一列的组内的最大值选择列内容。根据每个基因的最大值选择标记名称
- python - 如何在 Python 中使用 selenium 复制所有网站?
- database - AWS RDS MYSQL 导入数据库拒绝访问
- java - IllegalArgumentException:找不到命名参数
- mysql - error while running the spring boot program
- ios - 在 UITableViewCell 中的自定义 tableview 单元格下添加分隔线
- haskell - KnownNats 上的类型级归纳:重叠实例