Czy istnieje sposób, aby R wydał sygnał dźwiękowy / odtworzył dźwięk na końcu skryptu?

149

Kiedy uruchamiam skrypty R, robię coś innego na innym pulpicie. Jeśli nie sprawdzam często, nigdy nie wiem, kiedy coś się skończy. Czy istnieje sposób, aby wywołać sygnał dźwiękowy (np. Dźwięk systemowy) lub zmusić R do odtworzenia dźwięku lub powiadomienia warknięcia za pomocą jakiegoś kodu na końcu mojego skryptu?

Maiasaura
źródło

Odpowiedzi:

98
alarm()

Funkcja alarmu . Działa poprzez wysłanie \ado konsoli

deinst
źródło
1
Prosty i doskonały, ale bezużyteczny, jeśli wyłączyłeś głośnik komputera. Chociaż nie mam pojęcia, jak to działa w systemie Windows.
aL3xa
@Mulone: ​​działa dla mnie, MacOSX 10.11.1, R 3.2.2; słychać słaby dźwięk „poump”.
Benjamin,
5
Nie działa dla mnie na Windows 7, x64, R 3.2.2. Poniższy beeprpakiet działa jednak dobrze.
Augustin
159

Mam pakiet ( beepr), którego jedynym celem jest wydawanie dźwięków powiadomień w języku R, który powinien działać na wielu platformach. Uruchom następujące, aby zainstalować beepr i wydać dźwięk:

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

Więcej informacji na github: https://github.com/rasmusab/beepr

Rasmus Bååth
źródło
1
Hej Rasmus, wygląda świetnie. Pomyślałem, że zapytam, ponieważ ta strona ma dużą widoczność: czy można wywołać beepr z opcji, tj. Opcji (błąd = beepr (dźwięk = 9))? Nazywanie go po udanym uruchomieniu jest przydatne U & ja go użyję, ale byłoby też wspaniale go nazwać, jeśli kod ulegnie awarii ... Na zdrowie!
dez93_2000
4
Pewnie! Po prostu trzeba zawinąć go do funkcji takich jak to: options(error = function() {beep(9)}). Ale bardzo irytujące :)
Rasmus Bååth
3
Brawo! Działa na moim komputerze z systemem Windows 7, gdy niektóre inne sugestie nie.
jeramy Townsley
5
To właśnie wyprzedziło dplyr jako mój ulubiony pakiet: D
Mullefa
2
@lukeA while (1) beepr::beep(3) czy to było dla ciebie tak samo dziwne, jak dla mnie? :}
rawr
59

W systemie MacOSX możesz pozwolić komputerowi mówić:

system("say Just finished!")

i możesz także zmienić sztuczny głos, który będzie mówił:

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

Możesz wybrać dowolny głos dostępny na Twoim komputerze. W Yosemite możesz zobaczyć, które głosy są zainstalowane w Preferencjach systemowych -> Dyktowanie i mowa -> Zamiana tekstu na mowę .

VLC
źródło
50

Powinieneś mieć go tweetem po zakończeniu: http://cran.r-project.org/web/packages/twitteR/index.html

Ken Williams
źródło
2
Ken: To jest zajebiste! Teraz nie muszę nawet wisieć w tym samym pokoju. Mogę iść do happy hour i wypić piwo lub kilka, aż zobaczę, że kod jest gotowy! Właśnie go wypróbowałem i działa świetnie.
Maiasaura
33

alarm nie działa na moim komputerze z systemem Windows, więc stworzyłem funkcję, która faktycznie hałasuje.

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

To oczywiście może działać tylko w systemie Windows, ale nie gwarantuję, że będzie działać nawet na dowolnym komputerze z systemem Windows. Przetestowałem to tylko na moim komputerze, ale pomyślałem, że opublikuję go na wypadek, gdyby ktoś miał z tym ten sam problem, alarmco ja.

Dason
źródło
1
Dziwne. alarm()sprawia, że ​​moja maszyna hałasuje (XP, interaktywne uruchamianie R)
BenBarnes,
1
Kod Dason nie działa na moim komputerze z systemem Windows 7.
russellpierce
@drknexus Inne opcje nie działały na moim komputerze. Ten działał na mojej maszynie. Nigdy nie twierdziłem, że będzie działać na dowolnej maszynie, ale tylko zapewniłem, że alarm()nie działa na moim komputerze iz jakiegoś powodu tak.
Dason
29

kot ('Witaj, świecie! \ a')

mpk
źródło
Przepraszam Mario, ale to wcale nie pomaga. Jeśli widzę ekran, z całą pewnością mogę powiedzieć, kiedy to się skończy. Nie potrzebuję nic więcej. Szukałem czegoś słyszalnego. Przepraszam, że wybrałem twoją odpowiedź (nie mogę tego cofnąć).
Maiasaura
5
Dlaczego jest to odrzucane? Spójrz na alarmźródło, a zobaczysz, że to, co robi, to tylko cat("\a")wezwanie.
nico
Cóż, co wiesz ... oto opis: Daje użytkownikowi sygnał dźwiękowy lub wizualny. ale to to samo co cat("foo\a"). Może użytkownicy przeczytali to jako cat("Hello world!\n")? Trudno powiedzieć ...
aL3xa
2
Nie zrealizowałem alarmu () = cat ('\ a'), dzięki za wskazówkę. Na marginesie, można również zrobić „\ a” w C i C ++ (w ten sposób używam go do powiadamiania mnie o wykonywanych czynnościach). Druga uwaga dodatkowa, jeśli korzystasz z OS X i wybierz „Preferencje systemowe”> „Uniwersalny dostęp”> „Słuch”> włącz „Flash the screen…”, cały ekran miga po wykonaniu „a”.
mpk
17

Nie tylko to, możesz także umieścić epicką muzykę z YouTube, gdy program jest zakończony w pętli :) (dla Ubuntu / Debian :)

system("xdg-open 'http://www.youtube.com/watch?v=9jK-NcRmVcw'")
mołdawski
źródło
tak niestety ... został usunięty ... ale pomysł jest jasny :)
moldovean
1
Chcę tego spróbować, znajdź inną kopię! :)
Waldir Leoncio
12

Użyj, shell.exec("url")aby otworzyć klip YouTube w systemie Windows

Szwecja
źródło
Takie podejście jest niedoceniane. Stosunkowo długi sygnał, ale generowany sygnał łatwo wyciszony (w przeciwieństwie do krótkiego / a).
russellpierce
... poniżej udzielam odpowiedzi tego samego typu, która powinna działać na platformach innych niż Windows.
russellpierce
11

AKTUALIZACJA:

W systemie macOS 10.9 (Mavericks) i nowszym możesz publikować powiadomienia przy użyciu zwykłego AppleScript:

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

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

Eliminuje to potrzebę instalacji terminal-notifier, o której mowa poniżej.

-

Mam zainstalowany terminal-notifier na moim Macu, aby otrzymywać powiadomienia na pulpicie z wiersza poleceń. Następnie możesz zakończyć wywołanie system()polecenia w ten sposób (oczywiście zmień ścieżkę):

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

}

Możesz wywołać tę funkcję w ten sposób

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

aby otrzymać taką wiadomość:

wprowadź opis obrazu tutaj

Aktualizacja: polecenie zawarte w @ VLC say.

Stewart Macdonald
źródło
10

Co powiesz na coś w miarę niezależnego od systemu operacyjnego dla systemów operacyjnych z graficznym interfejsem użytkownika i przeglądarkami internetowymi? Działa nawet na serwerze RStudio!

browseURL('https://www.youtube.com/watch?v=QH2-TGUlwu4')
russellpierce
źródło
4
W połowie spodziewałem się rick roll
Ic3fr0g
8

Lub jeśli używasz dystrybucji GNU / Linux i masz moduł pcspkr na czarnej liście (głośnik PC zawsze mnie denerwował), spróbuj połączyć systemz jakimś dźwiękowym / wizualnym powiadomieniem, np.

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

Możesz sprawdzić podręcznik zenity, jeśli wolisz alert w, powiedzmy, obszarze powiadomień ... Ale dzięki systemfunkcji możesz zrobić prawie wszystko: wysłać wiadomość e-mail, uruchomić inny skrypt, zrestartować komputer sudo rm -rf *.*itp. Cokolwiek ... i mam to na myśli.

Ale to oznacza tylko IF używasz GNU / Linux (UNIX) lub dystrybucji, w przeciwnym razie kij do konkretnych poleceń systemu Windows, choć w tym przypadku, nie mogę dać ci wiele informacji ...

aL3xa
źródło
7
Odpowiednikiem tego w MacOSX jest growlnotifyskrypt (w pakiecie z Growl ( growl.info ):system("growlnotify -t 'R script info' -m 'Finished!'")
Michael Dunn
6

Zainspirowana beepr, jest to funkcja, której obecnie używam do tego typu problemów: 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
źródło
6

A może puszczasz muzykę?

shell.exec("foo/Born.to.be.wild.mp3")
Chirayu Chamoli
źródło
5

spójrz na ten pakiet: RPushBullet

Interfejs R do usługi przesyłania wiadomości Pushbullet, która zapewnia szybkie i wydajne powiadomienia (i przesyłanie plików) między komputerami, telefonami i tabletami

RPushbullet jest całkowicie darmowy i wieloplatformowy. Jeśli chodzi o twoje pytanie, możesz użyć tej biblioteki, aby wysłać wiadomość Push do przeglądarki, ale oczywiście staje się niesamowite, gdy potrzebujesz czegoś, co może Cię powiadomić, gdy Cię nie ma. Ponadto twórcą pakietu R jest ten sam, co dobrze znany Rcpp, Dirk Eddelbuettel. Powiedziałbym, że warto spróbować!

Ja ja
źródło
0

Możesz użyć notify-sendpolecenia:

system("notify-send \"R script finished running\"")
JonnyRobbie
źródło
4
Jaki system operacyjny, jaki kontekst?
sindri_baldur
0

Z powodu tych wielu pomysłów stworzyłem rozwiązanie bez dostępu do Internetu, ponieważ pracuję z klientem VPN w systemie Windows. Odtwarza więc typowy dźwięk systemu Windows, który zwykle występuje w każdym systemie operacyjnym 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)
      }
    }

Funkcja bez pętli

    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
źródło
1
Chociaż odpowiedziałeś na to pytanie w dobrym formacie, zapoznaj się z tą stroną pomocy, aby uzyskać lepszą odpowiedź. Jak napisać dobrą odpowiedź?
v8-E