Gibt es eine Möglichkeit, R am Ende eines Skripts einen Signalton zu erzeugen?


149

Wenn ich R-Skripte ausführe, mache ich etwas anderes auf einem anderen Desktop. Wenn ich nicht häufig nachschaue, weiß ich nie, wann etwas fertig ist. Gibt es eine Möglichkeit, einen Piepton auszulösen (wie einen System-Piepton) oder R dazu zu bringen, einen Sound abzuspielen oder das Knurren über einen Code am Ende meines Skripts zu benachrichtigen?

Antworten:


98
alarm()

Die Alarmfunktion . Es funktioniert durch Senden \aan die Konsole


1
Einfach und perfekt, aber nutzlos, wenn Sie den PC-Lautsprecher deaktiviert haben. Obwohl ich keine Ahnung habe, wie es unter Windows läuft.
aL3xa

@ Mulone: ​​funktioniert für mich, MacOSX 10.11.1, R 3.2.2; Sie hören das leise "Poump" Geräusch.
Benjamin

5
Funktioniert bei mir nicht unter Windows 7, x64, R 3.2.2. Das folgende beeprPaket funktioniert jedoch einwandfrei.
Augustin

159

Ich habe ein Paket ( beepr) mit dem alleinigen Zweck, Benachrichtigungssounds in R zu erzeugen, das plattformübergreifend funktionieren sollte. Führen Sie die folgenden Schritte aus, um beepr zu installieren und einen Sound zu erzeugen:

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

Weitere Informationen unter github: https://github.com/rasmusab/beepr


1
Hey Rasmus, sieht cool aus. Ich dachte, ich würde hier fragen, da diese Seite sehr gut sichtbar ist: Kann Beepr über Optionen aufgerufen werden, dh über Optionen (Fehler = Beepr (Sound = 9))? Es ist nützlich, es nach einem erfolgreichen Lauf aufzurufen. Ich werde es verwenden, aber es wäre auch großartig, es aufzurufen, wenn der Code abstürzt ... Prost!
dez93_2000

4
Sicher! Sie müssen es nur in eine Funktion wie diese einschließen : options(error = function() {beep(9)}). Super irritierend :)
Rasmus Bååth

3
Hurra! Es funktioniert auf meinem Windows 7-Computer, wenn einige der anderen Vorschläge dies nicht taten.
Jery ​​Townsley

5
Dies ist jetzt dplyr als mein Lieblingspaket überholt: D
Mullefa

2
@lukeA while (1) beepr::beep(3) war das für dich genauso komisch wie für mich? :}
rawr

59

Unter MacOSX können Sie den Computer sprechen lassen:

system("say Just finished!")

und Sie können auch die künstliche Stimme ändern, die spricht:

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

Sie können jede Stimme auswählen, die auf Ihrem Computer verfügbar ist. Auf Yosemite können Sie sehen, welche Stimmen in den Systemeinstellungen -> Diktat & Sprache -> Text zu Sprache installiert sind .



33

alarm funktioniert auf meinem Windows-Computer nicht, daher habe ich eine Funktion erstellt, die tatsächlich Geräusche macht.

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

Dies könnte natürlich nur unter Windows funktionieren, aber ich kann nicht garantieren, dass es sogar auf einem beliebigen Windows-Computer ausgeführt wird. Ich habe es nur auf meinem Computer getestet, aber ich dachte, ich würde es veröffentlichen, falls jemand das gleiche Problem damit hat alarmwie ich.


1
Seltsam. alarm()macht meine Maschine ein Geräusch (XP, R interaktiv
ausführen

1
Dasons Code scheint auf meinem Windows 7-Computer nicht zu funktionieren.
Russellpierce

@drknexus Die anderen Optionen funktionierten auf meinem Computer nicht. Dieser arbeitete an meiner Maschine. Ich habe nie behauptet, dass es auf einem beliebigen Computer funktionieren würde, sondern nur, dass es alarm()auf meinem Computer nicht funktioniert, und aus irgendeinem Grund funktioniert dies auch nicht.
Dason

29

Katze ('Hallo Welt! \ a')


Sorry Mario, aber das hilft überhaupt nicht. Wenn ich den Bildschirm sehen kann, kann ich mit Sicherheit sagen, wann es fertig ist. Ich muss nichts mehr ausgeben. Ich suchte etwas Hörbares. Tut mir leid, dass ich Ihre Antwort beantwortet habe (kann das scheinbar nicht rückgängig machen).
Maiasaura

5
Warum wird das herabgestimmt? Schauen Sie sich die alarmQuelle an und Sie werden sehen, dass es sich nur um einen cat("\a")Anruf handelt.
Nico

Nun, was weißt du ... hier ist eine Beschreibung: Gibt dem Benutzer ein akustisches oder visuelles Signal. aber es ist das gleiche wie cat("foo\a"). Vielleicht haben die Benutzer dies als gelesen cat("Hello world!\n")? Schwer zu sagen ...
aL3xa

2
Alarm () = cat ('\ a') wurde nicht erkannt, danke für den Tipp. Als Randnotiz kann man auch '\ a' in C und C ++ machen (so habe ich es benutzt, um mich über die Dinge zu informieren, die getan werden). Eine zweite Randnotiz: Wenn Sie unter OS X arbeiten und "Systemeinstellungen"> "Universeller Zugriff"> "Hören"> "Bildschirm blinken ..." aktivieren, blinkt Ihr gesamter Bildschirm, wenn "a" ausgeführt wird.
mpk

17

Nicht nur das, du kannst auch epische Musik von Youtube einfügen, wenn das Programm fertig ist :) (Für Ubuntu / Debian :)

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

ja, leider ... es wurde entfernt ... aber die idee ist klar :)
moldauisch

1
Ich möchte es versuchen, bitte finden Sie eine andere Kopie! :)
Waldir Leoncio

12

Bitte verwenden Sie shell.exec("url"), um einen YouTube-Clip unter Windows zu öffnen


Dieser Ansatz wird unterschätzt. Relativ langes Signal, aber leicht stummgeschaltetes Signal (im Gegensatz zu einem kurzen / a).
Russellpierce

... Ich gebe unten eine Antwort des gleichen Typs an, die auf anderen Plattformen als Windows funktionieren sollte.
Russellpierce

11

AKTUALISIEREN:

Mit macOS 10.9 (Mavericks) und höher können Sie Benachrichtigungen mit einfachem AppleScript veröffentlichen:

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

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

Dadurch entfällt die Notwendigkeit der Installation terminal-notifier(siehe unten).

- -

Ich habe Terminal-Notifier auf meinem Mac installiert Desktop - Benachrichtigungen von der Kommandozeile zu erhalten. Sie können dann einen Aufruf des system()Befehls wie folgt abschließen (ändern Sie natürlich den Pfad):

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

}

Sie können die Funktion so aufrufen

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

um eine Nachricht wie diese zu erhalten:

Geben Sie hier die Bildbeschreibung ein

Update: Enthält den sayBefehl von @ VLC .


10

Wie wäre es mit etwas, das für Betriebssysteme mit GUIs und Webbrowsern einigermaßen betriebssystemunabhängig ist? Es funktioniert sogar auf RStudio Server!

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

4
Ich hatte halb mit einem Rick Roll
gerechnet

8

Oder wenn Sie die GNU / Linux-Distribution verwenden und das PCspkr- Modul auf die schwarze Liste gesetzt haben (der PC-Lautsprecher hat mich immer gestört ), versuchen Sie es systemmit einer akustischen / visuellen Benachrichtigung, z

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

Sie können das Zenity- Handbuch überprüfen, wenn Sie beispielsweise im Benachrichtigungsbereich eine Warnung bevorzugen. Mit der systemFunktion können Sie jedoch so ziemlich alles tun: eine E-Mail senden, ein anderes Skript ausführen, den Computer neu starten sudo rm -rf *.*usw. Alles ... und ich meine es.

Aber das steht nur IF Sie GNU / Linux (oder UNIX) Verteilung laufen lassen , andernfalls Stick Windows - spezifische Befehle, obwohl in diesem Fall kann ich Ihnen nicht viele Informationen geben ...


7
Das MacOSX-Äquivalent dazu ist das growlnotifySkript (im Paket mit Growl ( growl.info ):system("growlnotify -t 'R script info' -m 'Finished!'")
Michael Dunn

6

Inspiriert von beepr, ist dies die Funktion, die ich derzeit für diese Art von Problemen verwende: 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

Schauen Sie sich dieses Paket an: RPushBullet

Eine R-Schnittstelle zum Pushbullet-Messaging-Dienst, die schnelle und effiziente Benachrichtigungen (und Dateiübertragungen) zwischen Computern, Telefonen und Tablets ermöglicht

RPushbullet ist völlig kostenlos und plattformübergreifend. Was Ihre Frage betrifft, können Sie diese Bibliothek verwenden, um einen Push an Ihren Browser zu senden. Offensichtlich wird es jedoch erstaunlich, wenn Sie etwas benötigen, das Sie während Ihrer Abwesenheit benachrichtigen kann. Darüber hinaus ist der Schöpfer des R-Pakets derselbe wie der bekannte Rcpp Dirk Eddelbuettel. Ich würde sagen, es ist einen Versuch wert!


0

Sie können den folgenden notify-sendBefehl verwenden:

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

4
Welches Betriebssystem, welcher Kontext?
Sindri_baldur

0

Aufgrund dieser vielen Ideen habe ich eine Lösung ohne Internetzugang erstellt, da ich mit einem VPN-Client unter Windows arbeite. Es wird also ein typischer Windows-Sound abgespielt, der normalerweise auf jedem Windows-Betriebssystem ausgeführt wird.

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

Funktion ohne Schleife

    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
Obwohl Sie diese Frage in einem guten
v8-E
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.