R Shiny - запускает всплывающее окно блестящий непосредственно из пользовательского интерфейса, используя javascript - PullRequest
0 голосов
/ 04 февраля 2020

С помощью следующего фрагмента кода я могу вызвать чистое javascript alert, нажав на знак вопроса в файле:

enter image description here

            fileInput('peptides', 
                      span("Peptides file  ",
                           id="peptidesSpan",
                           tags$a(
                             tags$i(class='fa fa-question-circle'),
                             href = "#",
                             onclick = "alert('Oops!'); return false;")
                      ),
                      multiple=FALSE,
                      accept = c('text/csv','text/comma-separated-values',
                      )
            )

Мне было интересно, могу ли я вызвать всплывающее окно shinyalert (https://github.com/daattali/shinyalert/) вместо простого javascript оповещения, непосредственно формирующего пользовательский интерфейс без какого-либо наблюдателя на стороне сервера ,

Что-то вроде:

shinyalert("Oops!", "Something went wrong.", type = "error")

Если для этого не существует обходного пути, любые другие предложения с наблюдателем также приветствуются.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Я думаю, что использование наблюдателя совсем не неудобно.

Вместо alert(), вызовите Shiny.setInputValue(id, value);, и затем на стороне вашего сервера вы можете observeEvent(input[id], { shinyalert() }).

. Прочитайте эту статью для деталей: https://shiny.rstudio.com/articles/communicating-with-js.html

Для этого вам нужно использовать только один блок кода наблюдения.

Пример

Определить пользовательскую функцию в вашем коде пользовательского интерфейса Javascript и вызвать ее в вашем onclick. Вы можете поместить эту функцию, скажем, в помощник. js в папке 'www' в папке вашего проекта, которая будет www/helper.js. Включите этот файл в свой код Shiny UI: tags$head(tags$script(src = "helper.js"))

function showAlert(message, type = "info") {
  Shiny.setInputValue(
    'alertMessage',
    {
      message: message,
      type: type
    },
    { priority: 'event' }
  );
}

Затем на стороне сервера Shiny определите наблюдателя один раз

observeEvent(input$alertMessage, {
  alertData <- input$alertMessage
  req(alertData)

  shinyalert("title", alertData$message, type = alertData$type)
})

0 голосов
/ 04 февраля 2020

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

  1. Я скачал файл sweetAlert.js библиотеки Sweet Alert прямо из здесь
  2. Я создаю папку www в root моего приложения Shiny
  3. Я добавил файл sweetAlert. js в каталог www и в dashboardBody () ui.RI добавил следующую строку:

    tags$head(tags$script(src="sweetAlert.js"))

Теперь я могу напрямую вызывать функцию Swal.fire с любым аргументом, как это обычно делается в любой другой среде, которая запускает javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...