Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用invalidateLater()自动更新表格或绘图_R_Plot_Shiny_Auto Update - Fatal编程技术网

使用invalidateLater()自动更新表格或绘图

使用invalidateLater()自动更新表格或绘图,r,plot,shiny,auto-update,R,Plot,Shiny,Auto Update,我想了解为什么在observeEvent()内部使用invalidateLater()时,下表不会自动更新。我准备了以下程序来说明我的问题,“mytable2”使用reactiveTimer()并产生所需的输出,而“mytable”使用invalidaterater()并且除非我单击“更新”按钮,否则不会自动更新。为什么? library(shiny) ui <- fluidPage( sidebarLayout( sidebarPanel( actionBut

我想了解为什么在
observeEvent()
内部使用
invalidateLater()
时,下表不会自动更新。我准备了以下程序来说明我的问题,“mytable2”使用
reactiveTimer()
并产生所需的输出,而“mytable”使用
invalidaterater()
并且除非我单击“更新”按钮,否则不会自动更新。为什么?

library(shiny)

ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      actionButton("update", "Update")
    ),

    mainPanel(
      column(6, tableOutput('mytable')),
      column(6, tableOutput('mytable2'))
    )
  )
)

server <- function(input, output) {

  values <- reactiveValues(df   = RenderMyTable())

  observeEvent(invalidateLater(1000), {
    values$df <- RenderMyTable()  # This does not update after 1 sec
  })

  observeEvent(input$update, {
    values$df <- RenderMyTable()  # This does update upon clicking
  })

  output$mytable  <- renderTable(values$df)  # Depends on reactiveValues

  autoInvalidate <- reactiveTimer(1000)

  output$mytable2 <- renderTable({
    autoInvalidate()
    RenderMyTable()  # >This does update after 1 sec
  })
}

time1 <- Sys.time()  # Start time
df <- data.frame(a = 1:1000)  # Some data

RenderMyTable <- function(){
  # Seconds since start time
  time2 <- as.integer(difftime(Sys.time(), time1, units="secs"))

  df.now <- df[1:time2,]  # Updates each second

  df.now
}

shinyApp(ui = ui, server = server)
库(闪亮)

ui首先,我想说的是,我从这段代码中学到了一些东西,这是一种自动化绘图更改的非常简洁的方法,因此,谢谢您,我将在将来使用它

对于您的问题,我已经研究了
invalidaterater
,它使用了反应和观察功能,正如您所做的那样。只需从
observeEvent
更改为
observeEvent
,并将
invalidateLater
函数移动到代码的主块中,而不是将其作为参数传递,即可在第一个表输出中修复此问题

以下是我的想法来源的一个工作版本的链接:

对于您的后续问题,我们可以通过与之前完全相同的流程来完成:

output$autoupdate_plot <- renderPlot({

    invalidateLater(2000)
    hist(rnorm(isolate(RenderMyTable())))

  })

首先,我想说的是,我从这段代码中学到了一些东西,这是一种非常巧妙的自动化绘图更改的方法,因此,谢谢您,我将在将来使用它

对于您的问题,我已经研究了
invalidaterater
,它使用了反应和观察功能,正如您所做的那样。只需从
observeEvent
更改为
observeEvent
,并将
invalidateLater
函数移动到代码的主块中,而不是将其作为参数传递,即可在第一个表输出中修复此问题

以下是我的想法来源的一个工作版本的链接:

对于您的后续问题,我们可以通过与之前完全相同的流程来完成:

output$autoupdate_plot <- renderPlot({

    invalidateLater(2000)
    hist(rnorm(isolate(RenderMyTable())))

  })

你为什么不把
RenderMyTable()
作为一个反应函数呢?为什么不把
RenderMyTable()作为一个反应函数呢?