Existe-t-il un moyen de faire émettre un bip / jouer un son à la fin d'un script?


149

Lorsque j'exécute des scripts R, je fais autre chose sur un autre bureau. Si je ne vérifie pas fréquemment, je ne sais jamais quand quelque chose est terminé. Existe-t-il un moyen d'appeler un bip (comme un bip système) ou de demander à R de jouer un son ou de notifier le grognement via un code à la fin de mon script?

Réponses:


98
alarm()

La fonction d' alarme . Cela fonctionne en envoyant \aà la console


1
Simple et parfait, mais inutile si vous avez désactivé le haut-parleur du PC. Bien que je n'ai aucune idée de comment cela fonctionne sous Windows.
aL3xa

@Mulone: ​​fonctionne pour moi, MacOSX 10.11.1, R 3.2.2; vous entendez le faible son "poump".
Benjamin

5
Ne fonctionne pas pour moi sous Windows 7, x64, R 3.2.2. Le beeprpackage ci-dessous fonctionne bien cependant.
Augustin

159

J'ai un package ( beepr) dans le seul but de faire des sons de notification dans R qui devraient fonctionner multi-plateforme. Exécutez ce qui suit pour installer beepr et émettre un son:

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

Plus d'informations sur github: https://github.com/rasmusab/beepr


1
Hé Rasmus, ça a l'air cool. Je pensais que je demanderais ici puisque cette page a beaucoup de visibilité: peut-on appeler beepr à partir d'options, c'est-à-dire d'options (error = beepr (sound = 9))? L'appeler après une exécution réussie est utile U & je vais l'utiliser, mais ce serait aussi super de l'appeler si le code plante ... Cheers!
dez93_2000

4
Sûr! Il vous suffit de l' envelopper dans une fonction comme ceci: options(error = function() {beep(9)}). Super irritant cependant :)
Rasmus Bååth

3
Hourra! Cela fonctionne sur ma machine Windows 7 alors que certaines des autres suggestions ne le faisaient pas.
jeramy townsley

5
Ceci est maintenant dépassé dplyr comme mon package préféré: D
Mullefa

2
@lukeA while (1) beepr::beep(3) était-ce aussi bizarre pour vous que pour moi? :}
rawr

59

Sur MacOSX, vous pouvez laisser l'ordinateur parler:

system("say Just finished!")

et vous pouvez également changer la voix artificielle qui parlera:

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

Vous pouvez choisir n'importe quelle voix disponible sur votre ordinateur. Sur Yosemite, vous pouvez voir quelles voix sont installées dans les Préférences Système -> Dictée et Parole -> Synthèse vocale .



33

alarm ne fonctionne pas sur ma machine Windows, j'ai donc créé une fonction qui fait du bruit.

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

Cela ne pourrait clairement fonctionner que sur Windows, mais je ne garantis pas qu'il fonctionnera même sur un ordinateur Windows arbitraire. Je ne l'ai testé que sur ma machine, mais je me suis dit que je le publierais au cas où quelqu'un aurait le même problème alarmque moi.


1
Bizarre. alarm()fait que ma machine fasse du bruit (XP, exécutant R interactivement)
BenBarnes

1
Le code de Dason ne semble pas fonctionner sur ma machine Windows 7.
russellpierce

@drknexus Les autres options ne fonctionnaient pas sur ma machine. Celui-ci a fonctionné sur ma machine. Je n'ai jamais prétendu que cela fonctionnerait sur une machine arbitraire, mais seulement à condition que cela alarm()ne fonctionne pas sur ma machine et pour une raison quelconque, cela fonctionne.
Dason

29

chat ('Bonjour le monde! \ a')


Désolé Mario mais cela n'aide pas du tout. Si je peux voir l'écran, je peux certainement dire quand c'est fait. Je n'ai plus besoin de sortir. Je cherchais quelque chose d'audible. Désolé, j'ai sonné votre réponse (je n'arrive pas à annuler cela).
Maiasaura

5
Pourquoi cela est-il rejeté? Regardez la alarmsource et vous verrez que ce qu'elle fait n'est qu'un cat("\a")appel.
nico

Eh bien, que savez-vous ... voici une description: Donne un signal sonore ou visuel à l'utilisateur. mais c'est la même chose que cat("foo\a"). Peut-être que les utilisateurs ont lu ceci comme cat("Hello world!\n")? Difficile à dire ...
aL3xa

2
Je n'ai pas réalisé alarm () = cat ('\ a'), merci pour le tuyau. En remarque, on peut aussi faire '\ a' en C et C ++ (c'est ainsi que je l'ai utilisé pour me notifier des choses en cours). Une deuxième note latérale, si vous êtes sous OS X et que vous faites «Préférences système»> «Accès universel»> «Audition»> activez «Flash de l'écran ...», tout votre écran clignote lorsque «a» est exécuté.
mpk

17

Non seulement cela, vous pouvez également mettre de la musique épique de Youtube lorsque le programme est terminé en boucle :) (Pour Ubuntu / Debian :)

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

oui, malheureusement ... il a été supprimé ... mais l'idée est claire :)
moldovean

1
Je veux essayer ceci, veuillez en trouver une autre copie! :)
Waldir Leoncio

12

Veuillez utiliser shell.exec("url")pour ouvrir un clip YouTube sur Windows


Cette approche est sous-estimée. Signal relativement long mais signal facilement silencieux généré (par opposition à un bref / a).
russellpierce

... Je donne une réponse du même type ci-dessous qui devrait fonctionner sur des plates-formes autres que Windows.
russellpierce

11

METTRE À JOUR:

Avec macOS 10.9 (Mavericks) et versions ultérieures, vous pouvez publier des notifications à l'aide d'AppleScript simple:

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

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

Cela supprime le besoin d'installer terminal-notifier, référencé ci-dessous.

-

J'ai installé Terminal-notifier sur mon Mac pour recevoir des notifications sur le bureau à partir de la ligne de commande. Vous pouvez ensuite conclure un appel à la system()commande comme ceci (changez le chemin, évidemment):

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

}

Vous pouvez appeler la fonction comme ceci

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

pour recevoir un message comme celui-ci:

entrez la description de l'image ici

Mise à jour: commande incluse @ VLC say.


10

Que diriez-vous de quelque chose de raisonnablement indépendant du système d'exploitation pour les systèmes d'exploitation avec des interfaces graphiques et des navigateurs Web? Cela fonctionne même sur RStudio Server!

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

4
Je m'attendais à moitié à un rick roll
Ic3fr0g

8

Ou si vous utilisez la distribution GNU / Linux et que le module pcspkr est sur liste noire (le haut-parleur du PC m'a toujours ennuyé), essayez de le combiner systemavec une notification auditive / visuelle, par exemple

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

Vous pouvez vérifier zenity manuel si vous préférez alerte, par exemple, la zone de notification ... Mais, avec la systemfonction, vous pouvez faire à peu près tout: envoyer un e - mail, exécutez un autre scénario, redémarrer la machine, sudo rm -rf *.*etc. quoi que ce soit ... et je le pense.

Mais cela ne vaut que SI vous exécutez une distribution GNU / Linux (ou UNIX), sinon, respectez les commandes spécifiques à Windows, bien que dans ce cas, je ne puisse pas vous donner beaucoup d'informations ...


7
L'équivalent MacOSX de ceci est le growlnotifyscript ( fourni avec Growl ( growl.info ):system("growlnotify -t 'R script info' -m 'Finished!'")
Michael Dunn

6

Inspiré par beepr, c'est la fonction que j'utilise actuellement pour ce genre de problèmes: 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

jetez un œil à ce package: RPushBullet

Une interface R vers le service de messagerie Pushbullet qui fournit des notifications (et un transfert de fichiers) rapides et efficaces entre ordinateurs, téléphones et tablettes

RPushbullet est entièrement gratuit et multi-plateforme. En ce qui concerne votre question, vous pouvez utiliser cette bibliothèque pour envoyer un Push à votre navigateur, mais cela devient évidemment incroyable lorsque vous avez besoin de quelque chose qui peut vous avertir lorsque vous êtes absent. De plus, le créateur du package R est le même que le célèbre Rcpp, Dirk Eddelbuettel. Je dirais que ça vaut le coup!



0

En raison de ces nombreuses idées, j'ai créé une solution sans accès Internet, car je travaille avec un client VPN avec Windows. Donc, il joue un son Windows typique, qui est généralement sur n'importe quel système d'exploitation 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)
      }
    }

Fonction sans boucle

    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
Bien que vous ayez répondu à cette question dans un format correct
v8-E
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.