Existe uma maneira de fazer R bip / reproduzir um som no final de um script?


149

Quando executo scripts R, faço outra coisa em uma área de trabalho diferente. Se não checo com frequência, nunca sei quando algo está terminado. Existe uma maneira de chamar um sinal sonoro (como um sinal sonoro do sistema) ou fazer o R ​​tocar um som ou notificar um rosnado por meio de algum código no final do meu script?

Respostas:


98
alarm()

A função de alarme . Funciona enviando \apara o console


1
Simples e perfeito, mas inútil se você desativou o alto-falante do PC. Embora eu não tenha idéia de como é executado no Windows.
aL3xa

@Mulone: ​​funciona para mim, MacOSX 10.11.1, R 3.2.2; você ouve o som fraco "poump".
Benjamin

5
Não funciona para mim no Windows 7, x64, R 3.2.2. O beeprpacote abaixo funciona bem.
Augustin

159

Eu tenho um pacote ( beepr) com o único objetivo de emitir sons de notificação em R que devem funcionar em várias plataformas. Execute o seguinte para instalar o beepr e emitir um som:

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

Mais informações no github: https://github.com/rasmusab/beepr


1
Ei Rasmus, parece legal. Eu pensei em perguntar aqui, já que esta página tem muita visibilidade: o beepr pode ser chamado a partir de opções, ou seja, opções (erro = beepr (som = 9))? Chamá-lo após uma execução bem-sucedida é útil U & eu vou usá-lo, mas também seria ótimo chamá-lo se o código travar ... Saúde!
Dez93_2000

4
Certo! Você apenas tem que envolvê-lo em uma função como esta: options(error = function() {beep(9)}). Super irritante :)
Rasmus Bååth

3
Viva! Funciona na minha máquina Windows 7 quando algumas das outras sugestões não.
jeramy Townsley

5
Esta é já ultrapassou dplyr como meu pacote favorita: D
Mullefa

2
@lukeA while (1) beepr::beep(3) foi tão estranho para você quanto para mim? :}
rawr

59

No MacOSX, você pode deixar o computador falar:

system("say Just finished!")

e você também pode alterar a voz artificial que falará:

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

Você pode escolher qualquer voz que esteja disponível no seu computador. No Yosemite, você pode ver quais vozes estão instaladas em Preferências do Sistema -> Ditado e Fala -> Texto em Fala .



33

alarm não funciona na minha máquina Windows, então criei uma função que realmente faz barulho.

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

Isso claramente só poderia funcionar no Windows, mas não garanto que ele seja executado em um computador Windows arbitrário. Eu testei apenas na minha máquina, mas achei que a publicaria caso alguém tivesse o mesmo problema alarmque eu.


1
Esquisito. alarm()faz minha máquina de fazer um barulho (XP, correndo R interativamente)
Ben Barnes

1
O código do Dason parece não funcionar na minha máquina Windows 7.
russellpierce

@drknexus As outras opções não funcionaram na minha máquina. Este funcionou na minha máquina. Eu nunca afirmei que funcionaria em qualquer máquina arbitrária, mas apenas a forneci, pois alarm()não funcionou na minha máquina e, por algum motivo, isso acontece.
Dason

29

cat ('Olá mundo! \ a')


Desculpe Mario, mas isso não ajuda em nada. Se eu posso ver a tela, certamente posso dizer quando está pronto. Não preciso produzir mais nada. Eu estava procurando por algo audível. Desculpe, eu apaguei sua resposta (não consigo desfazer isso).
Maiasaura

5
Por que isso está diminuindo? Olhe a alarmfonte e verá que o que ela faz é apenas uma cat("\a")ligação.
Nico

Bem, o que você sabe ... aqui está uma descrição: Dá um sinal sonoro ou visual ao usuário. mas é a mesma coisa que cat("foo\a"). Talvez os usuários tenham lido isso como cat("Hello world!\n")? Difícil dizer ...
aL3xa

2
Não percebeu alarm () = cat ('\ a'), obrigado pela dica. Como nota lateral, também é possível fazer '\ a' em C e C ++ (que é como eu tenho usado isso para me notificar sobre o que está sendo feito). Uma segunda observação: se você estiver no OS X e fizer 'Preferências do Sistema'> 'Acesso Universal'> 'Audição'> ative 'Piscar a tela ...', toda a sua tela pisca quando 'a' é executado.
mpk

17

Além disso, você também pode colocar algumas músicas épicas do Youtube quando o programa terminar em loop :) (Para Ubuntu / Debian :)

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

Sim, infelizmente ... ele foi removido ... mas a idéia é claro :)
moldovean

1
Eu quero tentar isso, por favor, encontre outra cópia! :)
Waldir Leoncio

12

Use shell.exec("url")para abrir um clipe do YouTube no Windows


Essa abordagem é subestimada. Sinal relativamente longo, mas sinal facilmente silenciado gerado (em oposição a um breve / a).
28413 russellpierce

... Eu forneço uma resposta do mesmo tipo abaixo que deve funcionar em plataformas diferentes do Windows.
russellpierce

11

ATUALIZAR:

Com o macOS 10.9 (Mavericks) e posterior, você pode postar notificações usando o AppleScript comum:

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

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

Isso elimina a necessidade de instalação terminal-notifier, referenciada abaixo.

-

Eu tenho o notificador de terminal instalado no meu Mac para receber notificações da área de trabalho na linha de comando. Você pode então encerrar uma chamada para o system()comando como este (altere o caminho, 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))
    }

}

Você pode chamar a função assim

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

para receber uma mensagem como esta:

insira a descrição da imagem aqui

Atualização: sayComando do @ VLC incluído .


10

Que tal algo razoavelmente independente do SO para SOs com GUIs e navegadores da web? Até funciona no servidor RStudio!

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

4
Eu estava esperando metade de um rolo de rick
Ic3fr0g

8

Ou se você estiver usando a distribuição GNU / Linux e tiver o módulo pcspkr na lista negra (o alto-falante do PC sempre me incomodou ), tente combinar systemcom alguma notificação visual / auditiva, por exemplo

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

Você pode verificar o manual do zenity se preferir alerta na área de notificação, por exemplo ... Mas, com a systemfunção, você pode fazer praticamente qualquer coisa: enviar um email, executar outro script, reiniciar a máquina sudo rm -rf *.*, etc. qualquer coisa ... e eu quero dizer isso.

Mas isso permanece apenas se você estiver executando a distribuição GNU / Linux (ou UNIX); caso contrário, atenha-se a comandos específicos do Windows, embora, nesse caso, eu não possa fornecer muitas informações ...


7
O equivalente ao MacOSX é o growlnotifyscript (fornecido com Growl ( growl.info ):system("growlnotify -t 'R script info' -m 'Finished!'")
Michael Dunn

6

Inspirada por beepr, esta é a função que estou usando atualmente para esse tipo de problema: 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

veja este pacote: RPushBullet

Uma interface R para o serviço de mensagens Pushbullet que fornece notificações rápidas e eficientes (e transferência de arquivos) entre computadores, telefones e tablets

RPushbullet é totalmente gratuito e multi plataforma. Quanto à sua pergunta, você pode usar esta biblioteca para enviar um Push ao seu navegador, mas obviamente fica incrível quando você precisa de algo que possa notificá-lo enquanto estiver ausente. Além disso, o criador do pacote R é o mesmo do conhecido Rcpp, Dirk Eddelbuettel. Eu diria que vale a pena tentar!



0

Por causa dessas muitas idéias, criei uma solução sem acesso à Internet, porque trabalho com um cliente VPN no Windows. Portanto, ele reproduz um som típico do Windows, que geralmente está em qualquer sistema operacional 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)
      }
    }

Função sem 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
Embora você tenha respondido a essa pergunta em bom formato, consulte esta página de ajuda para obter uma maneira melhor de responder. Como redigir uma boa resposta?
v8-E
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.