WedX - журнал о программировании и компьютерных науках

Возврат вывода системной консоли в пользовательский интерфейс

У меня есть скрипт bash, который я запускаю с помощью блестящего и system. Это занимает много времени, поэтому я хотел бы предоставить пользователю обратную связь о прогрессе. В сценарии bash у меня есть сообщения, которые периодически обновляют пользователя, и я пытаюсь найти способ их печати в пользовательском интерфейсе.

Вот минимальный рабочий пример, для которого я хотел бы, чтобы выходные данные 1 и выходные данные 2 возвращались пользователю в том виде, в котором они отображаются в консоли.

Любая помощь приветствуется.

library(shiny)

ui <- fluidPage(
  actionButton("run", "Print to Console")
)

server <- function(input, output, session) {
  observeEvent(input$run,{
    system(c("echo output 1; sleep 2; echo output 2"))
  })
}

shinyApp(ui, server)
02.02.2021

Ответы:


1

Я предлагаю запустить вашу команду system асинхронно и перенаправить вывод в файл журнала. Параллельно вы можете непрерывно читать лог-файл через reactiveFileReader.

Напротив, когда intern = TRUE сеанс R (и блестящий) блокируется во время выполнения команды.

Пожалуйста, проверьте следующее:

library(shiny)

file.create("commands.sh", "output.log")
Sys.chmod("commands.sh", mode = "0777", use_umask = TRUE)
writeLines(c("#!/bin/bash", "echo output 1","sleep 2", "echo output 2"), con = "commands.sh")

ui <- fluidPage(
  actionButton("run_intern", "Run intern"),
  textOutput("myInternTextOutput"),
  hr(),
  actionButton("run_extern", "Run extern"),
  textOutput("myExternTextOutput")
)

server <- function(input, output, session) {
  systemOutputIntern <- eventReactive(input$run_intern,{
    system(command = "echo output 1; sleep 2; echo output 2", intern = TRUE)
  })
  
  output$myInternTextOutput <- renderText(systemOutputIntern())
  
  observeEvent(input$run_extern,{
    system(command = "./commands.sh 2>&1 | tee output.log", intern = FALSE, wait = FALSE)
  })
  
  log <- reactiveFileReader(200, session, filePath = "output.log", readLines)
  output$myExternTextOutput <- renderText(log())
}

shinyApp(ui, server)

результат

PS: В качестве альтернативы вы можете проверить AsyncProgress из библиотеки (ipc).

02.02.2021
  • Нет необходимости идти в обход через файл, если вы выполняете внешнюю команду асинхронно, т.е. через pipe. 03.02.2021
  • Тогда как бы вы получили выход в блестящий реактив? 03.02.2021
  • @ismirsehregal Спасибо за предложения. Единственная проблема, которая у меня сейчас есть, заключается в том, что результаты появляются в пользовательском интерфейсе все сразу, а не последовательно, так что пользователю все еще интересно, каков прогресс. например, если бы мы установили sleep 100, это было бы не очень полезно. Любые идеи? 03.02.2021
  • @StephenWilliams Я только что протестировал Ubuntu, и вы правы. Это не работает должным образом при запуске команд напрямую с помощью system (я не знаю, почему). Однако он работает после переноса команд в отдельный скрипт. Пожалуйста, смотрите мое редактирование. 04.02.2021
  • @ismirsehregal это сработало очень хорошо. Благодарность! 04.02.2021
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]