有没有办法让 R 在脚本末尾发出哔哔声?

当我运行 R 脚本时,我会在不同的桌面上做一些其他的事情。如果我不经常检查,我永远不知道什么时候完成。有没有一种方法可以调用一个哔声(像系统哔声)或让 R 发出声音或通知咆哮通过一些代码在我的脚本结束?

55009 次浏览
alarm()

警报函数。它通过将 \a发送到控制台来工作

或者,如果您使用 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 *.*,等等。什么都行... 我是认真的。

但是这只是运行 GNU/Linux (或 UNIX)发行版的 如果,否则,坚持使用 Windows 特定的命令,尽管在这种情况下,我不能给你太多信息..。

Cat (‘ Hello world! a’)

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

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

alarm在我的 Windows 机器上无法工作,所以我创建了一个确实会产生噪音的函数。

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

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

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

在 MacOSX 上,你可以让电脑说话:

system("say Just finished!")

你还可以改变人工发出的声音:

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

您可以选择计算机上任何可用的语音。在优胜美地,你可以看到哪些声音被安装在 系统设定-> 听写及说话-> 文字转语音

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

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

更多信息请访问 github: https://github.com/rasmusab/beepr

受到 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)
}
}

看看这个包裹: RPushBullet

一个到 PushBullet 消息传递服务的 R 接口,它提供快速 以及计算机之间的高效通知(和文件传输) , 手机和平板电脑

RPushBullet 是完全免费的多平台。至于你的问题,你可以使用这个库向你的浏览器发送一个 Push,但是当你需要一些东西而不是在你不在的时候可以通知你的时候,显然它会变得很神奇。 此外,R 包的创建者与著名的 Rcpp Dirk Eddelbuettel 相同。值得一试!

更新:

在 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)

得到这样的信息:

enter image description here

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

放点音乐怎么样?

shell.exec("foo/Born.to.be.wild.mp3")

你可以使用 notify-send命令:

system("notify-send \"R script finished running\"")

对于那些拥有图形用户界面和网页浏览器的操作系统来说,一些独立于操作系统的东西怎么样? 它甚至可以在 RStudio 服务器上工作!

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

由于有这么多想法,我创建了一个没有 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)
}

使用 Windows语音合成器怎么样?

message <- "job done!"


system2(command = "PowerShell",
args = c("-Command",
"\"Add-Type -AssemblyName System.Speech;",
"$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
paste0("$speak.Speak('", message, "');\"")
))
                                               

这可以很好地用在迭代操作中,比如“第一个工作完成了”、“第二个工作完成了”等等:

say_something <- function(message) {
    

message <- paste0("$speak.Speak('", message, "');\"")
    

system2(command = "PowerShell",
args = c("-Command",
"\"Add-Type -AssemblyName System.Speech;",
"$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
                                    

message
))
}


operations <- c("1st.", "2nd.", "3rd.")
lapply(operations, function(x) say_something(message=paste(x, "job done")))


 

注意,这里使用了系统缺省语言设置。实例是基于英语教学的,可以使用 SelectVoice方法进行修改。检查可用的讲师使用:

  system2(command = "PowerShell",
args = c("-Command",
"\"Add-Type -AssemblyName System.Speech;",
"$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
"$speak.GetInstalledVoices().VoiceInfo")
)

这意味着:

    Gender                : Female
Age                   : Adult
Name                  : Microsoft Paulina Desktop
Culture               : pl-PL
Id                    : TTS_MS_PL-PL_PAULINA_11.0
Description           : Microsoft Paulina Desktop - Polish
SupportedAudioFormats : {}
AdditionalInfo        : {[Age, Adult], [Gender, Female], [Language, 415], [Name, Microsoft Paulina Desktop]...}


Gender                : Male
Age                   : Adult
Name                  : Microsoft David Desktop
Culture               : en-US
Id                    : TTS_MS_EN-US_DAVID_11.0
Description           : Microsoft David Desktop - English (United States)
SupportedAudioFormats : {}
AdditionalInfo        : {[Age, Adult], [Gender, Male], [Language, 409], [Name, Microsoft David Desktop]...}

最后一个函数是根据他的“名字”选择选择器,比如“ David”、“ Paulina”或“ Hazel”:

say_something <- function(message , voice) {
        

voice <- paste0("\"$speak.SelectVoice('Microsoft ", voice, " Desktop');" )
message <- paste0("$speak.Speak('", message, "');\"")
      

system2(command = "PowerShell",
args = c("-Command",
"\"Add-Type -AssemblyName System.Speech;",
"$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
voice,
message
))
}




operations <- c("1st.", "2nd.", "3rd.")


lapply(operations, function(x) say_something(message=paste(x, "job done"), voice="David"))

下面的代码产生哔声,并且不依赖于.mp3或.wav 文件:

switch(Sys.info()[['sysname']],
Linux = {
system('play -n synth 0.1 tri  1000.0')}
)

这样做:

song <- function() {
for(i in 1:2) {
for(i in 1:4) {
for(i in 1:4) {
beep(7)
Sys.sleep(0.25)
beep()
Sys.sleep(0.22)
}
beep(2)
}
beep(11)
}
beep(4)
}


song()

你可以随着音乐即兴演奏。

显然,Dason 的回答很棒,因为它基本上可以在任何 Windows 机器上运行,除了 R 本身,不需要其他任何东西。

但是我一直想知道的一件事是如何在代码运行之后让这些函数真正发出哔哔声。

如果你这样做:

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

你可以管道任何东西到它,它会返回任何你管道,所以你可以这样做。请看下面的例子。

fa <- psych::fa(x, 1) |> beepR()

我在这里使用的是在 R 4.1中引入的本地管道 |>,但是如果您愿意,可以使用 maggitr包中的 %>%管道; 它们的工作原理完全相同。不管怎样,一旦分析结束,它就会发出哔哔声,变量 fa将包含因子分析的结果。

当然,在这里我使用了 Dason 提供的 beep 函数,但是您也可以在下面指定的位置轻松地添加任何内容。

beepR <- function(x){
# your code here #
return(x)
}

如果希望在每次 RStudio 打开时添加该函数,请参考 RStudio 的 使用. Rprofile、 . Renviron、 Rprofile.site、 REnvironment. site、 rsession.conf 和 reps.conf 管理 R来学习如何使用。档案。

结合线程中的一些想法,我实现了以下内容:

options(error = function() {
if (interactive()) {
# require("beepr"); beep(10)
system("mplayer /usr/share/sounds/freedesktop/stereo/dialog-warning.oga ")
system("notify-send -u normal 'R session' 'An error occured!'")
}
})


我经常使用 stop()的交互式会话,如 RStudio,在脚本,我正在工作,并希望重新运行到一个点。这样我就可以在等待的时候切换到另一个桌面。我可以测试一下。侧写