有没有办法在脚本结束时使R哔哔声/播放声音?


149

当我运行R脚本时,我会在其他桌面上执行其他操作。如果我不经常检查,我永远不知道什么时候完成。有没有一种方法可以调用蜂鸣声(例如系统蜂鸣声)或让R播放声音或在脚本结尾通过一些代码通知咆哮?

Answers:


98
alarm()

报警功能。通过发送\a到控制台来工作


1
简单而完美,但是如果您禁用了PC扬声器,那将毫无用处。虽然我不知道它如何在Windows上运行。
aL3xa

@Mulone:适用于我,MacOSX 10.11.1,R 3.2.2; 您会听到微弱的“泵”声。
本杰明

5
在Windows 7,x64,R 3.2.2上不适用于我。beepr下面的程序包工作正常。
奥古斯丁

159

我有一个软件包(beepr),其唯一目的是在R中发出通知声音,该声音应可跨平台工作。运行以下命令以安装beepr并发出声音:

install.packages("beepr")
library(beepr)
beep()

在github上的更多信息:https : //github.com/rasmusab/beepr


1
嘿拉斯穆斯,看起来很酷。我想在这里问一下,因为此页面具有很高的知名度:可以从选项(例如options(error = beepr(sound = 9)))调用beepr吗?成功运行后调用它非常有用,我会使用它,但是如果代码崩溃,也最好调用它...干杯!
dez93_2000 2014年

4
当然!您只需要将其包装到这样的函数中即可:options(error = function() {beep(9)})。超级刺激:)
RasmusBååth2014年

3
万岁!当其他一些建议不起作用时,它可以在我的Windows 7计算机上使用。
jeramy townsley

5
现在已经取代dplyr作为我最喜欢的软件包:D
Mullefa 2015年

2
@lukeA while (1) beepr::beep(3) 是那样对您和我一样奇怪吗?:}
rawr

59

在MacOSX上,您可以让计算机讲话:

system("say Just finished!")

您还可以更改将要发出的人工声音:

system("say -v Kathy Just finished!")

您可以选择计算机上可用的任何声音。在优胜美地,您可以在系统偏好设置->听写和语音->文本到语音中查看安装了哪些语音



33

alarm 在我的Windows机器上不起作用,因此我创建了一个确实会产生噪音的函数。

beep <- function(n = 3){
    for(i in seq(n)){
        system("rundll32 user32.dll,MessageBeep -1")
        Sys.sleep(.5)
    }
}

显然,这只能在Windows上运行,但我不能保证它甚至可以在任意Windows计算机上运行。我只在我的机器上测试过它,但我想我会把它发布出来,以防有人遇到同样的问题alarm


1
奇怪的。alarm()使我的机器发出噪音(XP,以交互方式运行R)
BenBarnes 2012年

1
Dason的代码在我的Windows 7计算机上似乎不起作用。
russellpierce

@drknexus其他选项在我的计算机上不起作用。这是在我的机器上工作的。我从未声称它可以在任何一台机器上运行,但只是提供了它,因为它alarm()在我的机器上无法运行,由于某种原因,它可以运行。
戴森

29

猫('Hello world!\ a')


对不起,马里奥,但这根本没有帮助。如果我可以看到屏幕,那么我可以肯定地说出完成的时间。我不需要再输出任何东西。我正在寻找可听的东西。抱歉,我给您答复了(似乎无法撤消)。
Maiasaura

5
为什么这被低估?查看alarm源代码,您将看到它只是一个cat("\a")电话。
nico

好吧,您知道什么...这里是描述:向用户提供听觉或视觉信号。但这与相同cat("foo\a")。也许用户已将其阅读为cat("Hello world!\n")?很难说...
aL3xa

2
没有意识到Alarm()= cat('\ a'),谢谢。附带说明一下,也可以在C和C ++中执行“ \ a”(这就是我一直用它来通知我已完成的事情的方式)。另外,如果您使用的是OS X,并执行“系统偏好设置”>“通用访问权限”>“听力”>启用“刷新屏幕...”,则在执行“ a”时整个屏幕都会闪烁。
mpk

17

不仅如此,当程序完成循环时,您还可以从Youtube播放一些史诗般的音乐:)(对于Ubuntu / Debian :)

system("xdg-open 'http://www.youtube.com/watch?v=9jK-NcRmVcw'")

是的,不幸的是...它已被移除...但是这个想法很清楚:)
摩尔多瓦州2012年

1
我想尝试一下,请另找一份!:)
Waldir Leoncio

12

请使用shell.exec("url")来在Windows上打开一些YouTube剪辑


这种方法被低估了。相对较长的信号,但容易使信号静音(与简短的/ a相反)。
russellpierce

...我在下面提供了相同类型的答案,该答案应在Windows以外的平台上运行。
russellpierce

11

更新:

在macOS 10.9(Mavericks)及更高版本中,您可以使用普通的AppleScript发布通知:

theTitle <- "A Title"
theMsg <- "A message here"

cmd <- paste("osascript -e ", "'display notification ", '"', theMsg, '"', ' with title ', '"', theTitle, '"', "'", sep='')
system(cmd)

这消除了安装的需要terminal-notifier,下面将进行引用。

-

我在Mac上安装了终端通知程序,以便从命令行获取桌面通知。然后,您可以system()像这样包装对命令的调用(显然,更改路径):

notify <- function(msgString='Message from R', titleString='Message from R', speakIt=FALSE) {
    cmd <- paste('~/terminal-notifier/terminal-notifier.app/Contents/MacOS/terminal-notifier -message ', '"', msgString, '"  -title "', titleString, '"', sep='')
    system(cmd)

    if (speakIt) {
        system(paste('say', msgString))
    }

}

您可以像这样调用函数

notify("R is done", "Message from R", speakIt=TRUE)

得到这样的消息:

在此处输入图片说明

更新:包含@VLC的say命令。


10

对于具有GUI和Web浏览器的OS,合理地独立于OS的情况如何?它甚至可以在RStudio服务器上使用!

browseURL('https://www.youtube.com/watch?v=QH2-TGUlwu4')

4
我一半期望里克翻滚
Ic3fr0g 2013年

8

或者,如果您使用的是GNU / Linux发行版,并且将pcspkr模块列入了黑名单(PC扬声器始终让我烦恼),请尝试结合system一些听觉/视觉通知,例如

system("aplay -t wav /usr/share/sounds/phone.wav") # for auditive bell (an I mean it literary)
system("zenity --title=\"R script info\" --text=\"Script has finished with zero exit status\" --info") # for GTK dialog

您可以检查zenity手册,如果你喜欢,比方说,通知区域警报......但是,随着system功能,你可以做很多漂亮的事:发送电子邮件,运行一些其他的脚本,重新启动机器,sudo rm -rf *.*什么?我是认真的

但这个身高只有IF你正在运行的GNU / Linux(或UNIX)分配,否则,粘到Windows特定的命令,但在这种情况下,我不能给你多少信息...


7
与此growlnotify脚本等效的MacOSX是脚本(与Growl(grol.info打包):system("growlnotify -t 'R script info' -m 'Finished!'")
Michael Dunn,2010年

6

受启发beepr,这是我目前用于解决此类问题的功能:D

work_complete <- function() {
  cat("Work complete. Press esc to sound the fanfare!!!\n")
  on.exit(beepr::beep(3))

  while (TRUE) {
    beepr::beep(4)
    Sys.sleep(1)
  }
}


5

看一下这个包:RPushBullet

Pushbullet消息传递服务的R接口,可在计算机,电话和平板电脑之间提供快速有效的通知(和文件传输)

RPushbullet是完全免费的多种平台。关于您的问题,您可以使用此库将“推”发送到浏览器,但是显然,当您需要某些东西时,它比离开时可以通知您的情况变得令人惊讶。此外,R包的创建者与著名的Rcpp Dirk Eddelbuettel相同。我会说值得一试!



0

由于这些想法,我创建了一个无法访问Internet的解决方案,因为我使用Windows的VPN客户端。因此,它播放典型的Windows声音,通常在任何Windows操作系统上都可以。

#Function with loop, press Esc to stopp      
    alarm2 <- function(){
      while(TRUE){
        system("cmd.exe",input="C:/Windows/WinSxS/amd64_microsoft-windows-shell-sounds_31bf3856ad364e35_10.0.17134.1_none_fc93088a1eb3fd11/tada.wav")
        Sys.sleep(1)
      }
    }

无循环功能

    alarm3 <- function(){
        system("cmd.exe",input="C:/Windows/WinSxS/amd64_microsoft-windows-shell-sounds_31bf3856ad364e35_10.0.17134.1_none_fc93088a1eb3fd11/tada.wav")
        Sys.sleep(1)
    }

1
尽管您已经以很好的格式回答了这个问题,但是请参考此帮助页面以找到更好的回答方式。 我如何写一个好的答案?
v8-E
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.