Есть ли способ заставить R звучать / воспроизводить звук в конце скрипта?


149

Когда я запускаю R-скрипты, я делаю что-то еще на другом рабочем столе. Если я не часто проверяю, я никогда не знаю, когда что-то закончено. Есть ли способ вызвать гудок (например, системный гудок) или заставить R воспроизвести звук или уведомить рычание через какой-то код в конце моего сценария?

Ответы:


98
alarm()

Функция будильника . Работает, отправив \aна консоль


1
Просто и идеально, но бесполезно, если вы отключили динамик ПК. Хотя я понятия не имею, как он работает на Windows.
aL3xa

@Mulone: ​​у меня работает, MacOSX 10.11.1, R 3.2.2; Вы слышите слабый звук "poump".
Бенджамин

5
У меня не работает на Windows 7, x64, R 3.2.2. beeprПакет ниже работает отлично , хотя.
Августин

159

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

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

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


1
Эй, Расмус, выглядит круто. Я решил спросить здесь, так как эта страница имеет большую видимость: можно ли вызывать beepr из опций, т.е. из options (error = beepr (sound = 9))? Вызов его после успешного запуска полезен, и я буду его использовать, но также было бы здорово назвать его, если код падает ... Ура!
dez93_2000

4
Конечно! Вы просто должны обернуть его в функцию , как это: options(error = function() {beep(9)}). Хотя супер раздражает :)
Расмус Батх

3
Ура! Он работает на моем компьютере с Windows 7, когда некоторые другие предложения не сработали.
Джереми Таунсли

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 вы можете увидеть, какие голоса установлены в Системные настройки -> Диктовка и речь -> Текст в речь .


50

Вы должны получить твит, когда это будет сделано: http://cran.r-project.org/web/packages/twitteR/index.html


2
Кен: Это потрясающе! Теперь мне даже не нужно висеть в одной комнате. Я могу пойти в счастливый час и выпить пива или несколько, пока не увижу, что дм говорит, что код готов! Я только что попробовал, и это прекрасно работает.
Майасаура

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
Weird. alarm()шумит моя машина (XP, работает R в интерактивном режиме)
BenBarnes

1
Код Дэйсона не работает на моей машине с Windows 7.
russellpierce

@drknexus Другие опции не работали на моей машине. Этот работал на моей машине. Я никогда не утверждал, что это будет работать на любой произвольной машине, но только при условии, что alarm()это не работает на моей машине, и по какой-то причине это работает.
Дейсон

29

кошка ('Привет, мир! \ a')


Извините, Марио, но это совсем не помогает. Если я увижу экран, то наверняка скажу, когда это будет сделано. Мне больше ничего не нужно выводить. Я искал что-то слышимое. Извините, я отклонил ваш ответ (кажется, не могу этого отменить).
Майасаура

5
Почему это понижается? Посмотрите на alarmисточник, и вы увидите, что он просто cat("\a")звонит.
Нико

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

2
Не понял alarm () = cat ('\ a'), спасибо за подсказку. В качестве примечания можно также сделать '\ a' в C и C ++ (именно так я и использовал его, чтобы уведомить меня о том, что делается). Второе замечание: если вы работаете в OS X и выполняете «Системные настройки»> «Универсальный доступ»> «Слушание»> включаете «Вспышка экрана ...», весь экран мигает при выполнении «а».
mpk

17

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

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

да, к сожалению ... это было удалено ... но идея ясна :)
молдован

1
Я хочу попробовать это, пожалуйста, найдите другую копию! :)
Waldir Leoncio

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, на которую ссылаются ниже.

-

У меня есть терминальный-уведомитель , установленный на моем Mac , чтобы получать уведомления на рабочий стол из командной строки. Затем вы можете завершить вызов 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)

чтобы получить сообщение, подобное этому:

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

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


10

Как насчет чего-то достаточно независимого от ОС для ОС с графическим интерфейсом и веб-браузерами? Это даже работает на RStudio Server!

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

4
Я наполовину ожидал Рик Ролл
Ic3fr0g

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