Как отобразить слово из предложения одно за другим в определенный промежуток времени в блестящем веб-приложении? - PullRequest
0 голосов
/ 11 июля 2019

Я разрабатываю блестящее приложение для отображения слов и изображений из файла XML один за другим в заданный промежуток времени (скажем, 1 секунда) на блестящем интерфейсе пользователя. Если пользователь выбирает файл, он читает файл и отображает 1-е слово в пользовательском интерфейсе, затем через 1 секунду 1-е слово исчезает и 2-е слово отображается в пользовательском интерфейсе, а затем снова через 1 секунду 2-е слово исчезает и 3-е слово отображается в пользовательском интерфейсе и т. Д. на. Если в файле есть изображение, оно также должно отображаться в пользовательском интерфейсе и через 1 секунду оно также должно исчезнуть. Я написал код, чтобы получить слово из предложения в каждую секунду интервала. Сейчас он отображается на консоли R, но я хочу отобразить эти слова и изображения в блестящем интерфейсе. Ниже приведена иллюстрация проблемы (это не мой настоящий код по соображениям чистоты, но он работает в качестве иллюстрации): Вот мой код:

library(shiny)
library(tokenizers)
library(magick)
library(stringr)
library(qdap)
library(xml2)


ui <- dashboardPage(skin = 'purple',
                   dashboardHeader(title = "Document Reader"),
                   dashboardSidebar(width = 200,
                                    sidebarMenu(
                                      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"))
                                    )
                   ),
                   dashboardBody(skin = 'purple',
                                 tabItems(
                                   # First tab content
                                   tabItem(tabName = "dashboard",
                                           h2("Dashboard tab content"),
                                           fluidRow(
                                             box(title = "Uploading File",
                                                 fileInput("file1", "Choose a Document:"),
                                                 actionButton(inputId = "submit",label = "Read")

                                             ),
                                             column(8,verbatimTextOutput("opt1"))
                                           )
                                   )
                                 )
                   )
)


server <- function(input, output, session) {

 dw <- eventReactive(input$submit,{
   filepath <- input$file1$datapath
   doc <- read_xml(filepath)
   nodeset <- xml_children(doc)
   for(i in 1:length(nodeset)){
     wpm <- as.integer(xml_attr(nodeset[i], "wpm"))
     #print(paste("WPM", wpm))
     data2 <-xml_find_all(nodeset[i], ".//p | .//localImage")
     line <-  xml_text(data2)
     image <-  xml_attr(data2, "descr")
     image <- image[!is.na(image)]

     for(j in line){
       #print(j)
       if ( j == ""){
         tiger =  image_read(image)
         sink(tempfile())
         print(tiger)
         sink()
       }
       else{
         words = unlist(strsplit(j, ' '))
         words = words[words !=""]
         words = str_remove_all(words, "\n")
         total = length(words)
         for (w in 1:total){
           len = length(words[[total]])
           for (w1 in 1:len){
             if (str_detect(words[[w]][w1],'[.]')){
               print(words[[w]][w1])
               Sys.sleep(1)
             } else {
               print(words[[w]][w1])
               Sys.sleep(0.5)
             }
           }
         }
       }
     }
   }
 })
 output$opt1 <- renderUI({
   dw()
 })
}

shinyApp(ui=ui, server=server)

Вот мой XML-файл:

<?xml version="1.0"?>
<data>
    <section wpm = "200">
         <p>History</p>
         <p>The society that sparked change at Cambridge</p>
         <p>The ancient university owes its scientific status to an unexpected source, finds Georgina Ferry.</p>
    <localImage id="0" caption = "The Cambridge Observatory was founded in 1823, four years after the Cambridge Philosophical Society" descr="/home/i9/DocumentReader/DocumentReader/image/Image1.png"/>
         <p>We conclude this section by discussing the problem of classification,since it will serve as a prototypical problem for a significant part of this book. It occurs frequently in practice: for instance, when performing spam filtering, we are interested in a yes/no answer as to whether an e-mail contains relevant information or not.</p>
    </section>
</data>

Как я могу отобразить эти слова на блестящем интерфейсе.

1 Ответ

0 голосов
/ 11 июля 2019

Я нахожу одно решение благодаря Google и смешиванию разных источников:

ui <- dashboardPage(skin = 'purple',
                    dashboardHeader(title = "Document Reader"),
                    dashboardSidebar(width = 200,
                                     sidebarMenu(
                                       menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"))
                                     )
                    ),
                    dashboardBody(skin = 'purple',
                                  tabItems(
                                    # First tab content
                                    tabItem(tabName = "dashboard",
                                            h2("Dashboard tab content"),
                                            fluidRow(
                                              box(title = "Uploading File",
                                                  fileInput("text", "Enter Text:"),
                                                  actionButton(inputId = "submit",label = "Read"))

                                              ,box(verbatimTextOutput("var"),column(8,uiOutput("opt1"))
                                            ),

                                              box(actionButton(inputId = "display",label = "display")
                                              )
                                    )                              



                    ))))

server <- function(input, output, session) {

  rv <- reactiveValues(words = character(0), n = 0,
                       sentence = "")
  # action button 
    # output$var <- renderText({
    #   if(input$display < length(input_file1()))
    #     return(input_file1()[input$display])
    # })
    # 

   observe({
     if(input$submit){
       rv$sentence <- unlist(strsplit(readLines(input$text$datapath), ' '))
     }
    # Re-execute this reactive expression immediately after 
    # it finishes (though you can also specify a longer time:
    # e.g. 1000 means re-execute after 1000 milliseconds have
    # passed since it was last executed)
    invalidateLater(1000, session)
    isolate({
      if (rv$n >= length(rv$sentence)) {
        return()
      } else {
        rv$n <- rv$n + 1
        rv$words <- rv$sentence[rv$n]
      }
      })
    })
    output$var <- renderPrint({
       return(rv$words)
    })


}

shinyApp(ui, server)

Подводя итог:

  1. Вы не можете использовать и reactiveEvent(), и observe()
  2. Вы можете использовать invalidateLater, действительно полезный для повторения наблюдения ()
  3. Вы должны изменить некоторые вещи, чтобы сделать это с XML, но в теории это будет работать, надеюсь,

Источник:

  1. R Shiny: реактивные значения против реактивных
  2. Вывод нескольких строк текста с помощью renderText () в R блестящий
  3. https://gist.github.com/bborgesr/61409e3852feb991336757f06392e52a
...