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?

Maiasaura
quelle

Antworten:

98
alarm()

Die Alarmfunktion . Es funktioniert durch Senden \aan die Konsole

deinst
quelle
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

Rasmus Bååth
quelle
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 .

VLC
quelle
50

Sie sollten es twittern lassen, wenn es fertig ist: http://cran.r-project.org/web/packages/twitteR/index.html

Ken Williams
quelle
2
Ken: Das ist großartig! Jetzt muss ich nicht einmal mehr im selben Raum hängen. Ich kann zur Happy Hour gehen und ein oder mehrere Bier trinken, bis ich sehe, dass ein dm sagt, dass der Code fertig ist! Ich habe es gerade ausprobiert und es funktioniert großartig.
Maiasaura
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.

Dason
quelle
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')

mpk
quelle
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'")
Schimmel
quelle
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

Schweden
quelle
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 .

Stewart Macdonald
quelle
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')
russellpierce
quelle
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 ...

aL3xa
quelle
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)
  }
}
Mullefa
quelle
6

Wie wäre es mit Musik?

shell.exec("foo/Born.to.be.wild.mp3")
Chirayu Chamoli
quelle
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!

Meme
quelle
0

Sie können den folgenden notify-sendBefehl verwenden:

system("notify-send \"R script finished running\"")
JonnyRobbie
quelle
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)
    }
Mongutea
quelle
1
Obwohl Sie diese Frage in einem guten
v8-E