Is there a way to make R beep/play a sound at the end of a script?

R

R Problem Overview


When I run R scripts I go do something else on a different desktop. If I don't check frequently, I never know when something is finished. Is there a way to invoke a beep (like a system beep) or get R to play a sound or notify growl via some code at the end of my script?

R Solutions


Solution 1 - R

I have a package (beepr) with the sole purpose of making notification sounds in R which should work cross-platform. Run the following to install beepr and make a sound:

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

More info at github: https://github.com/rasmusab/beepr

Solution 2 - R

alarm()

The alarm function. It works by sending \a to the console

Solution 3 - R

On MacOSX you can let the computer speak:

system("say Just finished!")

and you can also change the artificial voice that will speak:

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

You can pick any voice that is available on your computer. On Yosemite you can see which voices are installed in System Preferences -> Dictation & Speech -> Text to Speech.

Solution 4 - R

You should have it tweet when it's done: http://cran.r-project.org/web/packages/twitteR/index.html

Solution 5 - R

alarm doesn't work on my Windows machine so I created a function that does actually make noise.

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

This clearly could only work on Windows but I don't guarantee it will even run on an arbitrary Windows computer. I've only tested it on my machine but I figured I'd post it in case anybody has the same problem with alarm that I do.

Solution 6 - R

> cat('Hello world!\a')

Solution 7 - R

How about something reasonably OS independent for OSes with GUIs and web-browsers? It even works on RStudio Server!

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

Solution 8 - R

Not only that, you can also also put some epic music from Youtube when the program is done looping :) (For Ubuntu/Debian:)

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

Solution 9 - R

UPDATE:

With macOS 10.9 (Mavericks) and later, you can post notifications using plain AppleScript:

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

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

This removes the need to install terminal-notifier, referenced below.

--

I've got terminal-notifier installed on my Mac to get desktop notifications from the command line. You can then wrap up a call to the system() command like this (change the path, obviously):

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

You can call the function like this

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

to get a message like this:

enter image description here

Update: Included @VLC's say command.

Solution 10 - R

Please use shell.exec("url") to open some YouTube clip on Windows

Solution 11 - R

Or if you're using GNU/Linux distro and have pcspkr module blacklisted (PC speaker was always annoying me), try combining system with some auditive/visual notification, e.g.

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

You can check zenity manual if you prefer alert in, say, notification area... But, with system function, you can do pretty much anything: send an email, run some other script, reboot the machine, sudo rm -rf *.*, etc. anything... and I mean it.

But this stands only IF you're running GNU/Linux (or UNIX) distribution, otherwise, stick to Windows specific commands, though in that case, I can't give you much info...

Solution 12 - R

Inspired by beepr, this is the function I'm currently using for these kind of problems :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)
  }
}

Solution 13 - R

How about playing some music?

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

Solution 14 - R

take a look at this package: RPushBullet

> An R interface to the Pushbullet messaging service which provides fast > and efficient notifications (and file transfer) between computers, > phones and tablets

RPushbullet is completely free and multi platform. As for your question, you can use this library to send a Push to your browser, but obviously it becomes amazing when you need something than can notify you while you are away. Moreover, the creator of the R package is the same of the well known Rcpp, Dirk Eddelbuettel. I'd say it's worth a shot!

Solution 15 - R

How about using Windows SpeechSynthesizer?

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, "');\"")
        ))
                                               

This may by nicely used in iterating operations and read something like "First job done", "Second job done" etc.:

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

 

*Note, that this uses system defaul language settings. The example is based on english lector, it can be changed using SelectVoice method. To check available lectors use:

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

That gives:

    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]...}

Finally a function to select the lector by his "name" like "David", "Paulina" or "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"))

Solution 16 - R

Do this:

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

You can jam out to it.

Solution 17 - R

The following code produces a beep and does not depend on a .mp3 or .wav file:

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

Solution 18 - R

You can use notify-send command:

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

Solution 19 - R

Because of these many ideas, I have created a solution without Internet access, because I work with a VPN client with Windows. So it plays a typical Windows sound, which is usually on any Windows operating system.

#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)
      }
    }
    

#Function without loop 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) }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMaiasauraView Question on Stackoverflow
Solution 1 - RRasmus BååthView Answer on Stackoverflow
Solution 2 - RdeinstView Answer on Stackoverflow
Solution 3 - RVLCView Answer on Stackoverflow
Solution 4 - RKen WilliamsView Answer on Stackoverflow
Solution 5 - RDasonView Answer on Stackoverflow
Solution 6 - RmpkView Answer on Stackoverflow
Solution 7 - RrussellpierceView Answer on Stackoverflow
Solution 8 - RmoldoveanView Answer on Stackoverflow
Solution 9 - RStewart MacdonaldView Answer on Stackoverflow
Solution 10 - RSwedenView Answer on Stackoverflow
Solution 11 - RaL3xaView Answer on Stackoverflow
Solution 12 - RMullefaView Answer on Stackoverflow
Solution 13 - RChirayu ChamoliView Answer on Stackoverflow
Solution 14 - RMemeView Answer on Stackoverflow
Solution 15 - RMikolajMView Answer on Stackoverflow
Solution 16 - Ruser2863275View Answer on Stackoverflow
Solution 17 - RdzmantoView Answer on Stackoverflow
Solution 18 - RJonnyRobbieView Answer on Stackoverflow
Solution 19 - RMonguteaView Answer on Stackoverflow