C'è un modo per far suonare un R / emettere un suono alla fine di una sceneggiatura?


149

Quando eseguo gli script R, vado a fare qualcos'altro su un desktop diverso. Se non controllo frequentemente, non so mai quando qualcosa è finito. C'è un modo per invocare un segnale acustico (come un segnale acustico di sistema) o ottenere R per riprodurre un suono o notificare il ringhio tramite un codice alla fine del mio script?

Risposte:


98
alarm()

La funzione di allarme Funziona inviando \aalla console


1
Semplice e perfetto, ma inutile se hai disattivato l'altoparlante del PC. Anche se non ho idea di come funziona su Windows.
aL3xa,

@Mulone: ​​funziona per me, MacOSX 10.11.1, R 3.2.2; senti il ​​debole suono "sordo".
Benjamin,

5
Non funziona per me su Windows 7, x64, R 3.2.2. Il beeprpacchetto sotto funziona bene però.
Augustin

159

Ho un pacchetto ( beepr) con l'unico scopo di emettere suoni di notifica in R che dovrebbe funzionare multipiattaforma. Eseguire quanto segue per installare beepr ed emettere un suono:

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

Maggiori informazioni su github: https://github.com/rasmusab/beepr


1
Ehi Rasmus, sembra fantastico. Ho pensato di chiedere qui poiché questa pagina ha molta visibilità: può essere chiamato beepr da opzioni, cioè opzioni (errore = beepr (suono = 9))? Chiamarlo dopo una corsa di successo è utile U e lo userò, ma sarebbe anche bello chiamarlo se il codice si blocca ... Saluti!
dez93_2000,

4
Sicuro! Non vi resta che avvolgerlo in una funzione come questa: options(error = function() {beep(9)}). Super irritante però :)
Rasmus Bååth,

3
Evviva! Funziona sul mio computer Windows 7 quando alcuni degli altri suggerimenti non lo hanno fatto.
Jeramy Townley,

5
Questo è ora superato dplyr come il mio pacchetto preferito: D
Mullefa

2
@lukeA while (1) beepr::beep(3) era così strano per te come lo era per me? :}
rawr

59

Su MacOSX puoi far parlare il computer:

system("say Just finished!")

e puoi anche cambiare la voce artificiale che parlerà:

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

Puoi scegliere qualsiasi voce disponibile sul tuo computer. Su Yosemite puoi vedere quali voci sono installate in Preferenze di Sistema -> Dettatura e voce -> Sintesi vocale .



33

alarm non funziona sul mio computer Windows, quindi ho creato una funzione che effettivamente fa rumore.

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

Questo chiaramente potrebbe funzionare solo su Windows, ma non garantisco che funzionerà anche su un computer Windows arbitrario. L'ho provato solo sulla mia macchina ma ho pensato di pubblicarlo nel caso in cui qualcuno avesse lo stesso problema alarm.


1
Strano. alarm()fa sì che la mia macchina faccia rumore (XP, eseguendo R in modo interattivo)
BenBarnes,

1
Il codice di Dason non sembra funzionare sul mio computer con Windows 7.
Russellpierce,

@drknexus Le altre opzioni non funzionavano sulla mia macchina. Questo ha funzionato sulla mia macchina. Non ho mai sostenuto che avrebbe funzionato su qualsiasi macchina arbitraria, ma l'ho fornito solo dal momento che alarm()non ha funzionato sulla mia macchina e per qualche motivo questo funziona.
Dason,

29

cat ('Hello world! \ a')


Scusa Mario, ma non aiuta affatto. Se riesco a vedere lo schermo, allora posso sicuramente dire quando è finito. Non ho bisogno di produrre altro. Stavo cercando qualcosa di udibile. Scusa se ho cancellato la tua risposta (non riesco a annullarla)
Maiasaura,

5
Perché questo viene ridimensionato? Guarda la alarmfonte e vedrai che quello che fa è solo una cat("\a")chiamata.
nico,

Bene, che ne sai ... ecco una descrizione: dà un segnale acustico o visivo all'utente. ma è la stessa cosa di cat("foo\a"). Forse gli utenti hanno letto questo come cat("Hello world!\n")? Difficile da dire ...
aL3xa

2
Non ho realizzato alarm () = cat ('\ a'), grazie per il suggerimento. Come nota a margine si può anche fare '\ a' in C e C ++ (che è il modo in cui l'ho usato per avvisarmi delle cose che sono state fatte). Una seconda nota a margine, se sei su OS X e fai 'Preferenze di Sistema'> 'Accesso universale'> 'Udito'> abilita 'Flash lo schermo ...' tutto lo schermo lampeggia quando viene eseguito 'a'.
mpk,

17

Non solo, puoi anche mettere un po 'di musica epica da Youtube quando il programma è fatto in loop :) (Per Ubuntu / Debian :)

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

sì, sfortunatamente ... è stato rimosso ... ma l'idea è chiara :)
moldavo

1
Voglio provare questo, per favore trova un'altra copia! :)
Waldir Leoncio,

12

Si prega di utilizzare shell.exec("url")per aprire alcune clip di YouTube su Windows


Questo approccio è sottovalutato. Generato segnale relativamente lungo ma facilmente silenziato (al contrario di un breve / a).
Russellpierce,

... fornisco una risposta dello stesso tipo di seguito che dovrebbe funzionare su piattaforme diverse da Windows.
Russellpierce,

11

AGGIORNARE:

Con macOS 10.9 (Mavericks) e versioni successive, puoi pubblicare notifiche utilizzando semplicemente AppleScript:

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

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

Ciò elimina la necessità di installazione terminal-notifier, di seguito indicata.

-

Ho terminale-notifier installato sul mio Mac per ottenere le notifiche sul desktop dalla riga di comando. È quindi possibile concludere una chiamata al system()comando in questo modo (cambiare il percorso, ovviamente):

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

}

Puoi chiamare la funzione in questo modo

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

per ricevere un messaggio come questo:

inserisci qui la descrizione dell'immagine

Aggiornamento: incluso il saycomando di VLC .


10

Che ne dici di qualcosa di ragionevolmente indipendente dal SO per i SO con GUI e browser web? Funziona anche su RStudio Server!

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

4
Mi aspettavo per metà un lancio di rick
Ic3fr0g,

8

Oppure se stai usando la distribuzione GNU / Linux e hai il modulo pcspkr nella lista nera (l'altoparlante del PC mi ha sempre infastidito), prova a combinare systemcon qualche notifica uditiva / visiva, ad es.

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

Puoi controllare il manuale di zenity se preferisci avvisare, diciamo, nell'area di notifica ... Ma, con la systemfunzione, puoi fare praticamente qualsiasi cosa: inviare un'e-mail, eseguire qualche altro script, riavviare la macchina sudo rm -rf *.*, ecc. Qualsiasi cosa ... e dico sul serio.

Ma questo vale solo se stai eseguendo la distribuzione GNU / Linux (o UNIX), altrimenti, segui i comandi specifici di Windows, anche se in quel caso non posso darti molte informazioni ...


7
L'equivalente di MacOSX a questo è lo growlnotifyscript (impacchettato con Growl ( growl.info ):system("growlnotify -t 'R script info' -m 'Finished!'")
Michael Dunn

6

Ispirato da beepr, questa è la funzione che sto attualmente utilizzando per questo tipo di problemi: 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

dai un'occhiata a questo pacchetto: RPushBullet

Un'interfaccia R al servizio di messaggistica Pushbullet che fornisce notifiche rapide ed efficienti (e trasferimento di file) tra computer, telefoni e tablet

RPushbullet è completamente gratuito e multipiattaforma. Per quanto riguarda la tua domanda, puoi utilizzare questa libreria per inviare un Push al tuo browser, ma ovviamente diventa incredibile quando hai bisogno di qualcosa che ti può avvisare mentre sei via. Inoltre, il creatore del pacchetto R è lo stesso del noto Rcpp, Dirk Eddelbuettel. Direi che vale la pena provare!


0

Puoi usare il notify-sendcomando:

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

4
Quale sistema operativo, quale contesto?
sindri_baldur,

0

Grazie a queste tante idee, ho creato una soluzione senza accesso a Internet, perché lavoro con un client VPN con Windows. Quindi riproduce un tipico suono di Windows, che di solito si trova su qualsiasi sistema operativo 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)
      }
    }

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

1
Sebbene tu abbia risposto a questa domanda in un formato ben fatto, fai
v8-E,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.