Чи є спосіб зробити R звуковий сигнал / відтворити звук в кінці сценарію?


149

Коли я запускаю сценарії R, я йду робити щось інше на іншому робочому столі. Якщо я не перевіряю часто, я ніколи не знаю, коли щось закінчено. Чи є спосіб викликати звуковий сигнал (наприклад, системний звуковий сигнал) або змусити R відтворити звук або повідомити гарчання через якийсь код в кінці мого сценарію?

Відповіді:


98
alarm()

Функція тривоги . Це працює, надсилаючи \aна консоль


1
Простий та ідеальний, але марний, якщо ви відключили динамік ПК. Хоча я поняття не маю, як це працює в Windows.
aL3xa

@Mulone: ​​працює для мене, MacOSX 10.11.1, R 3.2.2; ви чуєте слабкий звук «пумпа».
Бенджамін

5
Не працює для мене в Windows 7, x64, R 3.2.2. beeprПакет нижче працює відмінно , хоча.
Августин

159

У мене є пакет ( beepr) з єдиною метою видавати звуки сповіщень на R, який повинен працювати міжплатформним. Виконайте наступне, щоб встановити звуковий сигнал і видати звук:

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

Більше інформації на github: https://github.com/rasmusab/beepr


1
Гей, Расмусе, виглядає круто. Я думав, що запитаю тут, оскільки ця сторінка має велику видимість: чи можна викликати звуковий сигнал з опцій, тобто опцій (помилка = звуковий сигнал (звук = 9))? Виклик його після успішного запуску є корисним U &, я буду використовувати його, але також було б чудово зателефонувати, якщо код вийде з ладу ... Ура!
dez93_2000

4
Звичайно! Ви просто повинні обернути його в функцію , як це: options(error = function() {beep(9)}). Супер дратує, хоча :)
Rasmus Bååth

3
Ура! Він працює на моїй машині Windows 7, коли деякі інші пропозиції не зробили.
jeramy townley

5
Це тепер наздогнало dplyr як мій улюблений пакет: D
Mullefa

2
@lukeA це while (1) beepr::beep(3) було для вас так само дивно, як і для мене? :}
rawr

59

На MacOSX ви можете дозволити комп'ютеру говорити:

system("say Just finished!")

і ви також можете змінити штучний голос, який буде говорити:

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

Ви можете вибрати будь-який голос, який є на вашому комп’ютері. На Yosemite ви можете бачити, які голоси встановлені в System Preferences -> Dictation & Speech -> Text to Speech .


50

Ви повинні мати його твіт, коли це зроблено: http://cran.r-project.org/web/packages/twitteR/index.html


2
Кен: Це геніально! Тепер мені навіть не доводиться вішати в одній кімнаті. Я можу піти до щасливої ​​години і випити пива чи кілька, поки не побачу dm, що говорить код зроблено! Я просто спробував це, і він чудово працює.
Майясаура

33

alarm не працює на моїй машині Windows, тому я створив функцію, яка насправді шумить.

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

Це, очевидно, може працювати лише в Windows, але я не гарантую, що він буде працювати навіть на довільному комп'ютері Windows. Я протестував це лише на своїй машині, але я подумав, що опублікую його, якщо хтось має таку ж проблему, alarmщо і я.


1
Дивно. alarm()змушує мою машину шуміти (XP, R працює інтерактивно)
BenBarnes

1
Здається, код Дайсона не працює на моїй машині Windows 7.
russellpierce

@drknexus Інші параметри не працювали на моїй машині. Цей працював на моїй машині. Я ніколи не стверджував, що він буде працювати на будь-якій довільній машині, але лише за умови, що він alarm()не працював на моїй машині, і чомусь це відбувається.
Дейсон

29

cat ("Привіт, світ! \ a")


Вибачте Маріо, але це зовсім не допомагає. Якщо я можу побачити екран, то я, безумовно, можу сказати, коли це зроблено. Мені більше нічого не потрібно. Я шукав щось чутне. Вибачте, що я відмовився від вашої відповіді (не можу це скасувати).
Майасаура

5
Чому це зменшується? Подивіться на alarmджерело, і ви побачите, що те, що воно робить, - це лише cat("\a")дзвінок.
nico

Ну, що ви знаєте ... ось опис: подає звуковий або візуальний сигнал користувачеві. але це те саме, що cat("foo\a"). Можливо, користувачі прочитали це як cat("Hello world!\n")? Важко сказати ...
aL3xa

2
Не усвідомив alarm () = cat ('\ a'), дякую за пораду. В якості бічної примітки можна також зробити "\ a" в C і C ++ (саме тому я використовую це для того, щоб сповіщати про те, що робиться). Друга сторона, якщо ви перебуваєте на OS X і робите "Налаштування системи"> "Універсальний доступ"> "Слух"> увімкніть "Спалах екрана ...", весь ваш екран блимає, коли виконується "a".
mpk

17

Мало того, ви також можете розмістити епічну музику з Youtube, коли програма робиться в циклі :) (Для Ubuntu / Debian :)

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

так, на жаль ... його зняли ... але ідея зрозуміла :)
moldovean

1
Я хочу спробувати це, будь ласка, знайдіть іншу копію! :)
Вальдір Леонсіо

12

Будь ласка, використовуйте, shell.exec("url")щоб відкрити якийсь кліп YouTube у Windows


Цей підхід недооцінений. Згенеровано відносно довгий сигнал, але з легким приглушенням сигналу (на відміну від короткого / а).
russellpierce

... Я надаю відповідь того ж типу нижче, який повинен працювати на інших платформах, ніж Windows.
russellpierce

11

ОНОВЛЕННЯ:

За допомогою macOS 10.9 (Mavericks) та новіших версій ви можете публікувати повідомлення за допомогою звичайного AppleScript:

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

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

Це усуває необхідність встановлення terminal-notifier, на яку посилається нижче.

-

У мене на комп’ютері встановлений термінальний сповіщувач, щоб отримувати сповіщення на робочому столі з командного рядка. Потім ви можете завершити виклик такої system()команди (очевидно, змінити шлях):

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

}

Ви можете назвати функцію так

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

щоб отримати таке повідомлення:

введіть тут опис зображення

Оновлення: включена sayкоманда @ VLC .


10

Як щодо щось розумно ОС, незалежне для ОС з графічними інтерфейсами та веб-браузерами? Він навіть працює на сервері RStudio!

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

4
Я наполовину очікував на рик-
рилл

8

Або якщо ви використовуєте дистрибутив GNU / Linux і маєте модуль pcspkr у чорний список (динамік ПК мене завжди дратував), спробуйте поєднати systemз деяким аудіо / візуальним сповіщенням, наприклад

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

Ви можете перевірити Zenity керівництва , якщо ви віддаєте перевагу попередження, скажімо, в області сповіщень ... Але, з systemфункцією, ви можете робити майже все: надіслати електронною поштою, запустити інший скрипт, перезавантажте комп'ютер, sudo rm -rf *.*і т.д. нічого ... і я маю на увазі це.

Але це означає лише те, якщо ви використовуєте GNU / Linux (або UNIX) розповсюдження, інакше дотримуйтесь певних команд Windows, хоча в такому випадку я не можу дати вам багато інформації ...


7
Еквівалентний цьому MacOSX - це growlnotifyсценарій (упакований з Growl ( зростанняl.info ):system("growlnotify -t 'R script info' -m 'Finished!'")
Майкл Данн,

6

Натхненна beeprцією функцією, яку я зараз використовую для таких проблем: 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

погляньте на цей пакет: RPushBullet

Інтерфейс R до служби обміну повідомленнями Pushbullet, який забезпечує швидке та ефективне сповіщення (та передачу файлів) між комп’ютерами, телефонами та планшетами

RPushbullet - це абсолютно безкоштовна та багатоплатформна платформа. Що стосується вашого питання, ви можете використовувати цю бібліотеку, щоб надіслати Push у ваш браузер, але очевидно, що це стає дивовижним, коли вам потрібно щось, ніж можна сповістити вас, коли ви не вдома. Більше того, творцем пакету R є той самий відомий Rcpp, Дірк Еддельбуеттель. Я б сказав, що варто зняти!


0

Ви можете використовувати notify-sendкоманду:

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

4
Що ос, який контекст?
sindri_baldur

0

Через ці багато ідей я створив рішення без доступу до Інтернету, оскільки працюю з клієнтом VPN з Windows. Так він відтворює типовий звук для Windows, який зазвичай є в будь-якій операційній системі 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)
      }
    }

Функція без циклу

    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
Незважаючи на те, що ви відповіли на це питання добре, перегляньте цю довідкову сторінку, щоб краще відповісти. Як написати гарну відповідь?
v8-E
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.