【问题标题】:Best (or good) way to display GGplots显示 GGplots 的最佳(或好)方法
【发布时间】:2017-09-07 21:13:03
【问题描述】:

我在 R 中创建了一个仪表板。从 6 周前开始,我对 R 一无所知/知之甚少,但上周我能够完成我的版本 1。现在的问题是如何在 Raspberry Pi 上呈现它。

我希望 R 脚本每 15 分钟运行一次以进行更新。在我看来,有两种方式。 我可以从 cron 作业运行 R 脚本,但除非我从本机 R 环境运行 R 脚本,否则它不会在屏幕上显示 GGPlot。

其次,我可以从 cron 作业运行 R 脚本,输出到 pdf,然后运行 ​​cron 作业以显示 pdf。 Xpdf 工作得很好,但这意味着每次迭代我都需要终止最后一次迭代,然后重新运行 Xpdf 以再次打开文件。

第二个选项是一种解决方法,但不是很漂亮。在这个阶段我的所有代码都在工作,但我会感谢任何人关于走哪条路线的意见。

【问题讨论】:

    标签: r linux cron raspberry-pi


    【解决方案1】:

    鉴于您使用 Shiny 构建仪表板,您可以使用 invalidateLater()。查看它的默认脚本:

    if (interactive()) {
      ui <- fluidPage(
        sliderInput("n", "Number of observations", 2, 1000, 500),
        plotOutput("plot")
      )
    
      server <- function(input, output, session) {
    
        observe({
          # Re-execute this reactive expression after 1000 milliseconds
          invalidateLater(1000, session)
    
          # Do something each time this is invalidated.
          # The isolate() makes this observer _not_ get invalidated and re-executed
          # when input$n changes.
          print(paste("The value of input$n is", isolate(input$n)))
        })
    
        # Generate a new histogram at timed intervals, but not when
        # input$n changes.
        output$plot <- renderPlot({
          # Re-execute this reactive expression after 2000 milliseconds
          invalidateLater(2000)
          hist(rnorm(isolate(input$n)))
        })
      }
    
      shinyApp(ui, server)
    }
    

    来源:https://shiny.rstudio.com/reference/shiny/latest/invalidateLater.html

    invalidateLater() 函数的第一个参数的值以毫秒为单位。 15 分钟是 900000 毫秒。

    编辑:根据内部命令,确实可以在特定时间间隔内重复脚本,它可以通过更多方式完成(link1link2 或其他包括invalidateLater() 在闪亮的上下文中)。以下是对其中一个的改编,以无限循环的形式每 6 秒绘制一次 ggplot2 直方图:

    library(ggplot2)
    
    plot_it <- function(){
      a <- rnorm(1000, mean = 50, sd = 10)
      print(summary(a)) 
      p <- ggplot()+geom_histogram(aes(x=a), bins=40)
      print(p)
    }
    
    repeat {
      startTime <- Sys.time()
      plot_it()
      sleepTime <- startTime - Sys.time()+ 6
      if (sleepTime > 0)
        Sys.sleep(sleepTime)
    }
    

    【讨论】:

    • 对不起 - 我没有使用 Shiny - 只是 GGPlot2
    • 如果你不介意我问你是用什么方式只用 ggplot2 创建仪表板的?通常当人们谈到 R 中的仪表板时,使用闪亮的概念是同义词。至少对我来说。对于内部 R 时间间隔重复,您还可以使用“重复”功能
    • 对不起,如果它是 TMI,但只是为了完整性。我连接到 MySQL 数据库并提取信息。我使用 R 对数字进行一些算术运算。然后我使用 GGPlot 创建一些图,然后将它们排列在一个网格中。我有文字和徽标,它们被转换为 grobs 以进行排列。
    • 好的,所以你的结果是 ggplots 从 grobs 的网格中排列。你用它做什么?您想将其放入网页中还是要将网格保存为图像?
    • 它只需要显示在屏幕上,每15分钟左右更新一次。我也想看看我是否可以将这些图转换为一种格式以在 Shiny 中显示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多