R 闪亮:添加回归线而不更改数据

R 闪亮:添加回归线而不更改数据,r,ggplot2,shiny,R,Ggplot2,Shiny,我正在编写一个闪亮的应用程序,可以调整绘图中的散布量。数据通过rnorm()生成。我使用ggplot2显示绘图。我想根据复选框的值显示或隐藏回归线。这一切都有效 但是,无论何时显示或隐藏回归线(不改变误差量),数据都会重新生成,这是我不希望看到的。我把数据放在一个反应函数中,希望它能解决问题,但事实并非如此 我尝试过使用geom_smooth和geom_abline(在代码中注释掉),但两者都会导致数据重新生成 问题:我是否可以在不更改数据的情况下添加/删除回归线?也就是说,仅当滑块更改时,点的

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

但是,无论何时显示或隐藏回归线(不改变误差量),数据都会重新生成,这是我不希望看到的。我把数据放在一个反应函数中,希望它能解决问题,但事实并非如此

我尝试过使用
geom_smooth
geom_abline
(在代码中注释掉),但两者都会导致数据重新生成

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

库(闪亮)
图书馆(GG2)
种子(42)

ui这里的问题是,您将您的
reactive
放在
renderPlot
中,这样每次
renderPlot
无效时,代码都会重新运行

相反,您应该将您的
被动
外部移动到主
服务器
功能中。然后,只有当其值由于
input$stdev
中的更改而无效时,它才会运行


但是,添加回归线时,始终必须重新渲染
ggplot
。据我所知,如果不重新渲染整个绘图,就无法在
ggplot
中添加一行。

这里的问题是,您将
反应性
放在
渲染图
中,这样每次
渲染图
无效时,代码都会重新运行

相反,您应该将您的
被动
外部移动到主
服务器
功能中。然后,只有当其值由于
input$stdev
中的更改而无效时,它才会运行


但是,添加回归线时,始终必须重新渲染
ggplot
。据我所知,如果不重新渲染整个绘图,就无法在
ggplot
中添加一行。

就像我在评论中写的那样,另一种方法是在reactive函数中设置
set.seed()

在您的反应功能内部是一个不同的环境。你的种子不再在那里被定义,。。。如果你把种子放在反应函数中,它应该会工作。 有关作用域的高级详细信息,请参见此处:

更好理解的示例:

library(shiny)
set.seed(1)
print("set seed outside server function:")
print(rnorm(1))
ui <- fluidPage(

)

server <- function(input, output, session) {
  observe({
    print("new environment seed not valid")
    print(rnorm(1))
  })

  observe({
    print("new environment but set seed here as well")
    set.seed(1)
    print(rnorm(1))
  })
}

shinyApp(ui, server)
库(闪亮)
种子(1)
打印(“在服务器功能外设置种子:”)
打印(格式(1))

ui就像我在评论中写的一样,另一种方法是在反应函数中设置
set.seed()

在您的反应功能内部是一个不同的环境。你的种子不再在那里被定义,。。。如果你把种子放在反应函数中,它应该会工作。 有关作用域的高级详细信息,请参见此处:

更好理解的示例:

library(shiny)
set.seed(1)
print("set seed outside server function:")
print(rnorm(1))
ui <- fluidPage(

)

server <- function(input, output, session) {
  observe({
    print("new environment seed not valid")
    print(rnorm(1))
  })

  observe({
    print("new environment but set seed here as well")
    set.seed(1)
    print(rnorm(1))
  })
}

shinyApp(ui, server)
库(闪亮)
种子(1)
打印(“在服务器功能外设置种子:”)
打印(格式(1))

ui您应该将您的
reactive
移动到
renderPlot
之外。然后,只有当其值无效时,才会运行它。但是,您必须始终重新渲染ggplot。这就成功了。我认为这一定是显而易见的。我尝试了各种排列,除了那一种。谢谢。您也可以在调用
rnorm()
之前使用
set.seed()
,这样您的“随机值”是固定的,…@BigDataScientist我为MWE包括了
set.seed()
,但您建议
set.seed()
(使用时)应该在
反应()中
功能而不是其当前位置?我的理解是,种子将在应用程序的初始启动时设置,因此应适用于所有后续交互。第一部分是正确的。在我的写作中有点不清楚,sry。在您的反应功能内部是一个不同的环境。你的种子不再在那里被定义,。。。如果您将种子放在反应函数中,它应该可以工作,是的,…。您应该将
反应
移动到
渲染图
之外。然后,只有当其值无效时,才会运行它。但是,您必须始终重新渲染ggplot。这就成功了。我认为这一定是显而易见的。我尝试了各种排列,除了那一种。谢谢。您也可以在调用
rnorm()
之前使用
set.seed()
,这样您的“随机值”是固定的,…@BigDataScientist我为MWE包括了
set.seed()
,但您建议
set.seed()
(使用时)应该在
反应()中
功能而不是其当前位置?我的理解是,种子将在应用程序的初始启动时设置,因此应适用于所有后续交互。第一部分是正确的。在我的写作中有点不清楚,sry。在您的反应功能内部是一个不同的环境。你的种子不再在那里被定义,。。。如果你把种子放在反应函数中,它应该会起作用,是的,….在某一点上,我在反应函数中绘制了我的大部分绘图,然后在外部添加了
geom_smooth
层,沿着
绘图的线条,在某一点上,我在反应函数中绘制了我的大部分绘图,然后在外部添加了
geom_smooth
层,沿着
绘图的线条