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?

Odpowiedzi:


98
alarm()

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


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


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ę .



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.


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


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'")

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


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.


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

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


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


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ć!



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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.