如何在shiny中逐个添加图表部件

6

我正在为我的统计课制作一些演示。除其他外,我想展示涉及的逐步过程。作为所寻找的简化示例,请考虑以下小型 R 函数:

toyPlot <- function() {
  x <- 1:100/100
  y <- x+rnorm(100,0,0.2)
  plot(x,y)
  Sys.sleep(2)
  abline(lm(y~x))
  Sys.sleep(2) 
  title(main="Fitted Line Plot")
}

它绘制散点图,等待两秒钟,添加LSR线,再等待两秒钟,然后添加标题。

现在,在shiny中做同样的事情时,它会完全等待4秒钟,然后一次性完成图形。

我花了一些时间寻找解决方案,并找到了一些看起来有用的命令(session$onFlushed,invalidateLater,reactiveTimer),但我无法让它们做我想要的事情。


1
这在一定时间后是至关重要的吗?还是说你可以随意打开和关闭图表的某些部分? - John Paul
2个回答

8
为什么不把绘图输出与动画滑块的值绑定在一起?您可以使用animationOptions控制每个阶段的持续时间。
ui <- fixedPage(
    plotOutput('myplot'),
    sliderInput('myslider', 'Steps', min=1, max=3, value=1, animate=animationOptions())
)


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

    x <- 1:100/100
    y <- x + rnorm(100, 0, 0.2)

    pfs <- list(
        function() plot(x, y) ,
        function() abline(lm(y~x)),
        function() title(main='Fitted line plot')
    )

    output$myplot <- renderPlot({
        for (i in 1:input$myslider) pfs[[i]]()
    })

}

runApp(list(ui=ui, server=server))

这正是我所需要的。谢谢! - Wolfgang Rolke

1
假设开启和关闭元素都是可以接受的,以下是一种方法。在您的ui.r中,您应该添加一个控件(现在只要一个checkboxInput就行),以切换元素的开启和关闭。 代码如下:
 checkboxInput(inputId="lineCheck", label = "Show line?", value =FALSE),

 checkboxInput(inputId="titleCheck", label = "Show title?", value =FALSE),

您的绘图输出将是:
toyPlot <- renderPlot({
  x <- 1:100/100
  y <- x+rnorm(100,0,0.2)
  plot(x,y)
  if(input$lineCheck){ abline(lm(y~x))}
  if(input$titleCheck){ title(main="Fitted Line Plot")}
}

你可以为坐标轴添加滑块范围、颜色选择下拉菜单、符号等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接