R Shiny — запуск приложения в фоновом режиме и выдача элементов управления пользовательского интерфейса с кодом

#r #shiny

#r #блестящий

Вопрос:

Я пишу виньетку для своего пакета приложений Shiny. В начале моей виньетки я создаю файл с именем screenshots.R , который создает красивые скриншоты моего приложения. Я создаю их следующим образом:

 webshot::appshot(mypackage::run_datepicker_app(),
                 file = "man/figures/datepicker.png", vwidth = 500, vheight = 200)
  

Это отлично работает и дает мне отличный скриншот того, что представляет собой — в данном случае — пару dateInput полей. Тем не менее, я хотел бы иметь возможность получить скриншот dateInput используемого приложения (скажем, с отображением выбора календаря).

Есть ли способ выдавать команды объекту приложения в скрипте, чтобы я мог получать скриншоты используемого приложения, а не делать это вручную?

Ответ №1:

Вы пробовали использовать ShinyDriver из shinytest пакета?

Вы можете использовать shinytest безголовый браузер для запуска приложения, взаимодействия с ним и создания скриншотов программно. Если у вас не установлен PhantomJS, вам необходимо выполнить shinytest::installDependencies() его перед использованием ShinyDriver . Все, что вам нужно сделать, это указать на каталог, содержащий блестящее приложение (в моем случае папка «MyApp»).

 install.packages("shinytest")
shinytest::installDependencies()

app <- shinytest::ShinyDriver$new("myApp")
app$takeScreenshot("screenshot1.png")
button <- app$findElement("#button")
button$click()
Sys.sleep(1)
app$takeScreenshot("screenshot2.png")                
app$stop()
  

Я запускаю приложение в безголовом браузере, делаю снимок экрана, нахожу кнопку с идентификатором «кнопка», нажимаю на нее и делаю еще один снимок экрана, затем закрываю приложение. Перейдите к определенным элементам, используя «#id», где id — это просто идентификатор, который вы ввели в shiny. Вы можете указать путь к файлу png в takeScreenshot вызовах, чтобы затем использовать их в своем коде в другом месте. Обратите внимание, что вам может потребоваться использовать Sys.sleep , чтобы остановить создание скриншотов до обновления пользовательского интерфейса.