¿Hay alguna manera de hacer que R suene / suene al final de un guión?

149

Cuando ejecuto scripts R, hago otra cosa en un escritorio diferente. Si no reviso con frecuencia, nunca sé cuándo algo está terminado. ¿Hay alguna manera de invocar un pitido (como un pitido del sistema) o hacer que R reproduzca un sonido o notifique un gruñido a través de algún código al final de mi script?

Maiasaura
fuente

Respuestas:

98
alarm()

La función de alarma . Funciona enviando \aa la consola

deinst
fuente
1
Simple y perfecto, pero inútil si ha desactivado el altavoz de la PC. Aunque no tengo idea de cómo se ejecuta en Windows.
aL3xa
@Mulone: ​​funciona para mí, MacOSX 10.11.1, R 3.2.2; escuchas el leve sonido de "poump".
Benjamin
55
No me funciona en Windows 7, x64, R 3.2.2. Sin beeprembargo, el siguiente paquete funciona bien.
Augustin
159

Tengo un paquete ( beepr) con el único propósito de hacer sonidos de notificación en R que debería funcionar multiplataforma. Ejecute lo siguiente para instalar beepr y emitir un sonido:

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

Más información en github: https://github.com/rasmusab/beepr

Rasmus Bååth
fuente
1
Hola Rasmus, se ve genial. Pensé en preguntar aquí ya que esta página tiene mucha visibilidad: ¿se puede llamar a beepr desde las opciones, es decir, opciones (error = beepr (sonido = 9))? Llamarlo después de una ejecución exitosa es útil U y lo usaré, pero también sería genial llamarlo si el código falla ... ¡Salud!
dez93_2000
44
¡Por supuesto! Sólo hay que envolverlo en una función como esta: options(error = function() {beep(9)}). Super irritante :)
Rasmus Bååth
3
¡Hurra! Funciona en mi máquina con Windows 7 cuando algunas de las otras sugerencias no lo hicieron.
jeramy townsley
55
Esto ahora ha superado a dplyr como mi paquete favorito: D
Mullefa
2
@lukeA ¿ while (1) beepr::beep(3) fue tan extraño para ti como lo fue para mí? :}
rawr
59

En MacOSX puedes dejar que la computadora hable:

system("say Just finished!")

y también puedes cambiar la voz artificial que hablará:

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

Puede elegir cualquier voz que esté disponible en su computadora. En Yosemite puede ver qué voces están instaladas en Preferencias del sistema -> Dictado y voz -> Texto a voz .

VLC
fuente
50

Debería hacer que tuitee cuando esté hecho: http://cran.r-project.org/web/packages/twitteR/index.html

Ken Williams
fuente
2
Ken: ¡Eso es genial! Ahora ni siquiera tengo que pasar el rato en la misma habitación. ¡Puedo ir a la hora feliz y tomarme una cerveza o unos pocos hasta que vea un mensaje que dice que el código está listo! Acabo de probarlo y funciona muy bien.
Maiasaura
33

alarm no funciona en mi máquina Windows, así que creé una función que realmente hace ruido.

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

Claramente, esto solo podría funcionar en Windows, pero no garantizo que incluso se ejecute en una computadora arbitraria de Windows. Solo lo probé en mi máquina, pero pensé que lo publicaría en caso de que alguien tuviera el mismo problema alarmque yo.

Razón
fuente
1
Extraño. alarm()hace que mi máquina haga ruido (XP, ejecutando R interactivamente)
BenBarnes
1
El código de Dason no parece funcionar en mi máquina con Windows 7.
russellpierce
@drknexus Las otras opciones no funcionaron en mi máquina. Este funcionó en mi máquina. Nunca dije que funcionaría en una máquina arbitraria, pero solo lo proporcioné, ya alarm()que no funcionó en mi máquina y, por alguna razón, esto funciona.
Dason
29

gato ('Hola mundo! \ a')

mpk
fuente
Lo siento Mario pero eso no ayuda en absoluto. Si puedo ver la pantalla, entonces ciertamente puedo decir cuándo está hecho. No necesito sacar nada más. Estaba buscando algo audible. Lo siento, expresé tu respuesta (parece que no puedo deshacer eso).
Maiasaura
55
¿Por qué se está rechazando esto? Mire la alarmfuente y verá que lo que hace es solo una cat("\a")llamada.
nico
Bueno, qué sabes ... aquí hay una descripción: Da una señal audible o visual al usuario. pero es lo mismo que cat("foo\a"). Tal vez los usuarios han leído esto como cat("Hello world!\n")? Difícil de decir ...
aL3xa
2
No me di cuenta de alarm () = cat ('\ a'), gracias por el consejo. Como nota al margen, también se puede hacer '\ a' en C y C ++ (que es como lo he estado usando para notificarme sobre las cosas que se están haciendo). Una segunda nota al margen, si está en OS X y hace 'Preferencias del sistema'> 'Acceso universal'> 'Audición'> habilite 'Destellar la pantalla ...' toda su pantalla parpadea cuando se ejecuta 'a'.
mpk
17

No solo eso, también puedes poner música épica de Youtube cuando el programa haya terminado de reproducirse :) (Para Ubuntu / Debian :)

system("xdg-open 'http://www.youtube.com/watch?v=9jK-NcRmVcw'")
moldavo
fuente
sí, desafortunadamente ... fue eliminado ... pero la idea es clara :)
moldovean
1
Quiero probar esto, ¡busca otra copia! :)
Waldir Leoncio
12

Úselo shell.exec("url")para abrir algún clip de YouTube en Windows

Suecia
fuente
Este es un enfoque subestimado. Señal relativamente larga, pero se genera una señal fácilmente silenciada (en lugar de una breve / a).
russellpierce
... Proporciono una respuesta del mismo tipo a continuación que debería funcionar en plataformas que no sean Windows.
russellpierce
11

ACTUALIZAR:

Con macOS 10.9 (Mavericks) y versiones posteriores, puede publicar notificaciones usando AppleScript simple:

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

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

Esto elimina la necesidad de instalar terminal-notifier, a la que se hace referencia a continuación.

-

Tengo instalado un terminal-notificador en mi Mac para recibir notificaciones de escritorio desde la línea de comandos. Luego puede finalizar una llamada al system()comando como este (cambiar la ruta, obviamente):

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

}

Puedes llamar a la función así

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

para recibir un mensaje como este:

ingrese la descripción de la imagen aquí

Actualización: Incluye el saycomando @ VLC .

Stewart Macdonald
fuente
10

¿Qué tal algo razonablemente independiente del sistema operativo para sistemas operativos con GUI y navegadores web? ¡Incluso funciona en RStudio Server!

browseURL('https://www.youtube.com/watch?v=QH2-TGUlwu4')
russellpierce
fuente
44
Casi
8

O si está utilizando la distribución GNU / Linux y tiene el módulo pcspkr en la lista negra (el altavoz de la PC siempre me molestó), intente combinarlo systemcon alguna notificación auditiva / visual, por ejemplo

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

Puede consultar el manual de zenity si prefiere la alerta en, por ejemplo, el área de notificación ... Pero, con la systemfunción, puede hacer casi cualquier cosa: enviar un correo electrónico, ejecutar otro script, reiniciar la máquina sudo rm -rf *.*, etc. cualquier cosa ... y hablo en serio.

Pero esto solo es válido si está ejecutando la distribución GNU / Linux (o UNIX), de lo contrario, cumpla con los comandos específicos de Windows, aunque en ese caso, no puedo darle mucha información ...

aL3xa
fuente
77
El equivalente de MacOSX a esto es el growlnotifyscript (empaquetado con Growl ( growl.info ):system("growlnotify -t 'R script info' -m 'Finished!'")
Michael Dunn
6

Inspirado por beepr, esta es la función que estoy usando actualmente para este tipo de problemas: 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
fuente
6

¿Qué tal tocar algo de música?

shell.exec("foo/Born.to.be.wild.mp3")
Chirayu Chamoli
fuente
5

Echa un vistazo a este paquete: RPushBullet

Una interfaz R para el servicio de mensajería Pushbullet que proporciona notificaciones rápidas y eficientes (y transferencia de archivos) entre computadoras, teléfonos y tabletas

RPushbullet es completamente gratuito y multiplataforma. En cuanto a su pregunta, puede usar esta biblioteca para enviar un Push a su navegador, pero obviamente se vuelve sorprendente cuando necesita algo que puede notificarle mientras está fuera. Además, el creador del paquete R es el mismo del conocido Rcpp, Dirk Eddelbuettel. ¡Diría que vale la pena intentarlo!

Meme
fuente
0

Puedes usar el notify-sendcomando:

system("notify-send \"R script finished running\"")
JonnyRobbie
fuente
44
¿Qué os, qué contexto?
sindri_baldur
0

Debido a estas muchas ideas, he creado una solución sin acceso a Internet, porque trabajo con un cliente VPN con Windows. Por lo tanto, reproduce un sonido típico de Windows, que generalmente se encuentra en cualquier 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)
      }
    }

Funcion sin lazo

    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
fuente
1
Aunque ha respondido esta pregunta en un formato correcto, consulte esta página de ayuda para una mejor manera de responder ¿Cómo escribo una buena respuesta?
v8-E