在knitr build完成时运行警报

时间:2017-09-20 05:25:09

标签: r rstudio knitr r-markdown

我正试图在编织完成后找到接收MacOS警报的方法。理想情况下,这应该在RStudio中按下“Knit”按钮时运行,而不必运行特殊的构建文件。

enter image description here

我认为我可以通过在代码中的某处策略性地插入以下代码来实现:

system('osascript -e \"display notification \\"Knit-Completed\\"\"')

熟悉RStudio knitr界面和knitr的人是否可以指出哪些插入此类代码最实用?

1 个答案:

答案 0 :(得分:2)

我喜欢系统弹出窗口的想法,但这似乎有点棘手,因为在Windows,Mac和Linux上运行会有不同的协议。以下是系统弹出窗口的一些想法。

基本框架

编织时会发生两件事:

  1. R在构建文件时遇到错误。
  2. 文件已成功构建
  3. 我们可以使用这些事件来触发代码,如下所示:

    ```{r echo = F}
    # When R encounters an error
    options(error = function(){
      #Run your code here
      }
     )
    
    # When R exits the knitr session    
    .Last <- function() {
      #Run your code here
      }
    ```
    

    此脚本需要放在Rmd文件的开头附近。理想情况下,将其与最初的设置包含在一起,或者将其保存为单独的R文件,然后在项目中包含行source("path_to_file.R")

    调整代码

    有许多不同的技术可用于创建通知。以下示例显示了一些可以使用的技术,并放置在上面代码中的#Run your code here位置:

    播放声音:如图here所示,最简单的方法是在退出时运行声音:

      beepr::beep()
      Sys.sleep(1) # This allows time for the sound to run
    

    注意:beepr :: beep(sound = 7)`可能更适合于错误消息:D

    Windows上的基本通知:如this指南中所示,您可以创建一个弹出窗口:

    system('CMD /C "ECHO The R process has finished running && PAUSE"',
       invisible=FALSE, wait=FALSE)
    

    Mac上的通知this帖子似乎非常有帮助

    发送电子邮件mail包可以发送电子邮件通知。每天最多只能发送20封电子邮件:

    mail::sendmail(recipient, subject="Notification from R",
    message="Calculation finished!", password="rmail")
    

    跨平台通知notifier R软件包目前似乎失败了,但它应该允许所有系统上的通知:

    library(notifier)
    notify(
      title = "Your title",
      msg = "Add detail here")
    )
    

    Mac上的终端通知This tool可用于从命令行创建通知。我没有Mac,因此无法测试此软件包。

    将通知推送至手机pushoverr package可让您向手机发送通知。功能看起来不错,但看起来你必须支付一些功能。

    Pushbullet RPushbullet可让您与Pushbullet服务进行互动。它提供了跨系统的一系列应用程序,但还没有涵盖Mac。

    enter image description here

    自定义文本Notificaiton

    对于任何基于文本的通知,您可以轻松自定义脚本的输出消息。以下是一些想法:

    显示运行时:可以显示运行代码所需的时间:

    # Put this at the start of the document
    time_start <- Sys.time()
    
    # Add this to the notification code
    (Sys.time() - time_start)
    

    显示文件名knitr::current_input()将显示正在编织的当前文件名。

    如果他们使用这些信息,那么看看人们提出的食谱会很棒。如果您有任何想法,请在评论中分享或将其添加到帖子的末尾。