Я создал эту простую модель предсказания текста. Как мне интегрировать свой основной код в созданное мной приложение Shiny? Как создать вывод на основе кода R, который я создал с помощью блестящего приложения

    library(tidyverse)
library(tidytext)
library(tm)
library(markovchain)



sherlock <- readLines('war.txt')



# Get chapter title
#chapter_title <- sherlock %>% 
  #filter(text != " ") %>% 
  #slice(c(4:15)) %>% 
  #pull(text) %>% 
  #tolower() %>% 
  #str_trim()


text_sherlock <- sherlock %>% 
  strsplit(" ") %>% 
  unlist() 

text_sherlock %>% head(30)

fit_markov <- markovchainFit(text_sherlock)

for (i in 1:10) {
  
  set.seed(i)
  
  markovchainSequence(n = 5, 
                      markovchain = fit_markov$estimate,
                      t0 = " ", include.t0 = T) %>% 
    
    # joint words
    paste(collapse = " ") %>% 
    
    # create proper sentence form
    str_replace_all(pattern = " ,", replacement = ",") %>% 
    str_replace_all(pattern = " [.]", replacement = ".") %>% 
    str_replace_all(pattern = " [!]", replacement = "!") %>% 
    
    str_to_sentence() %>% 
    
    print()
}

ui<- shinyUI(fluidPage(
  
  # Application title
  titlePanel("Shiny application to predict the next word"),
  
  fluidRow(HTML(" <strong>Author: x </strong>") ),
  fluidRow(HTML(" <strong>Date: 06-29-2020</strong>") ),
  
  fluidRow(
    br(),
    p("This Shiny application acts as text predictior app ")),
  br(),
  br(),
  
  fluidRow(HTML("<strong>Enter a word. Press \"Next words\" button to predict the following words</strong>") ),
  fluidRow( p("\n") ),
  
  # Sidebar layout
  sidebarLayout(
    
    sidebarPanel(
      textInput("inputString", "Enter a word here",value = " "),
      submitButton("Next words")
    ),
    
    mainPanel(
      h4("Predicted Next Word"),
      verbatimTextOutput("prediction"),
      textOutput('text1'),
      textOutput('text2')
    )
  )
))




shinyApp(ui,server)

T0 в последовательности markovchain - это место, куда должно войти слово, введенное в приложении Shiny, и дать результат. Пример

 markovchainSequence(n = 5, 
                      markovchain = fit_markov$estimate,
                      t0 = "prince", include.t0 = T)

дал мне результат как:

[1] "Prince answered pierre, asked pierre, looked"
[1] "Prince and stamped her father dismissed"
[1] "Prince and converse in a momentary"
[1] "Prince bowed and looking at four."
[1] "Prince and fussily in a low"
[1] "Prince bowed again turning to justify.”"
[1] "Prince was an inquiring look at"
[1] "Prince with a cousin of a"
[1] "Prince and the last deciding seriously"
[1] "Prince with the very nice, very"
the above output should come up in the final shiny output 
0
d123 30 Июн 2020 в 01:01

1 ответ

Лучший ответ

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

library(tidyverse)   # dplyr, stringr
library(tidytext)    # ?
library(tm)          # ?
library(markovchain) # markov* funcs
library(shiny)

# global section, available to both ui/server
sherlock <- readLines('war.txt')
text_sherlock <- unlist(strsplit(sherlock, " "))
fit_markov <- markovchainFit(text_sherlock)

make_sentences <- function(word, n = 10, use.seed = FALSE) {
  sapply(seq_len(n), function(i) {
    if (use.seed) set.seed(i)
    markovchainSequence(n = 5, 
                        markovchain = fit_markov$estimate,
                        t0 = word, include.t0 = TRUE) %>% 
      # joint words
      paste(collapse = " ") %>% 
      # create proper sentence form
      str_replace_all(pattern = " ([!,.])", replacement = "\\1") %>%
      str_to_sentence()
  })
}

# ui component (no changes here)
ui <- shinyUI(fluidPage( ... ))

server <- function(input, output, session) {
  sentences <- reactive({
    make_sentences(input$inputString)
  })
  output$prediction <- renderText({ sentences() })
}

shinyApp(ui, server)

Я не знаю, какие у вас намерения в отношении input$text1 и 2, и я предполагаю, что многие из них будут использовать if input$inputString. Надеюсь, я правильно угадаю.

Я решил разделить генератор предложений на его собственные реактивные данные, потому что часто (обычно?) Есть другой компонент HTML, который может использовать эти предложения для чего-то, например, для их подсчета, для поиска в них каких-то других `` мета '', кто знает . Как правило, в приложениях shiny я предпочитаю, чтобы фактический рендеринг был как можно более простым: один вызов table, один plot и т. Д., Но без генерации данных в них если возможно. Обмен данными между реактивными компонентами - очень полезная функция.

1
r2evans 29 Июн 2020 в 22:42