反应功能

时间:2020-07-15 20:49:38

标签: r shiny

在开始使用Shiny创建我的应用程序之前,我已经创建了一个函数(NextWordPrediction),该函数根据用户的输入来更新数据框,如下所示:

  1. 如果df中存在输入,则将其频率增加1
  2. 如果df中不存在输入,请将其添加

功能代码:

NextWordPrediction <- function(input) {
        dat <- dat %>%
            filter(., N_gram == str_count(input, "\\S+") + 1) %>%
            filter(grepl(paste("^", tolower(str_squish(input)), sep = ""), Word)) %>%
            arrange(., desc(Prop))
        
        if (nrow(dat) != 0) {
            assign("dat",
                   dat %>%
                       mutate(Frequency = ifelse(Word == input &
                                                     N_gram == str_count(input, "\\S+"),
                                                 Frequency + 1,
                                                 Frequency)) %>%
                       group_by(., N_gram) %>%
                       mutate(., Prop = Frequency/ sum(Frequency)) %>%
                       data.frame(.),
                   envir = .GlobalEnv)
            
            val <- dat$Word_to_Predict[1]
            ans <- paste(str_squish(input), val)
            
            return(list(ans, head(dat,5)))
            
        } else if (nrow(dat) == 0 & word(input, 1) != "NA") {
            assign("dat",
                   dat %>%
                       add_row(., Word = tolower(input), Frequency = + 1, N_gram = str_count(input, "\\S+"), 
                               Word_to_Predict = word(input, -1)) %>%
                       group_by(., N_gram) %>%
                       mutate(., Prop = Frequency/ sum(Frequency)) %>%
                       data.frame(.),
                   envir = .GlobalEnv)
            
            input_1 <-  Reduce(paste, word(input, 2:str_count(input,"\\S+")))
            
            return(NextWordPrediction(input_1))
            
        } else if (word(input, 1) == "NA") {
            ans <- paste("Word not in dictionary. We added this to our database!")
            
            return(ans)
        }
    }

下一步,我想将此功能扩展到Shiny应用程序,并且尝试了以下操作,但均未成功。函数可用性正常,但是输入后我的df不会相应更新。

server.R

library(shiny)

dat <- read.csv("dat_all.csv")

shinyServer(function(input, output) {
    
    NextWordPrediction <- function(input) {
        dat <- dat %>%
            filter(., N_gram == str_count(input, "\\S+") + 1) %>%
            filter(grepl(paste("^", tolower(str_squish(input)), sep = ""), Word)) %>%
            arrange(., desc(Prop))
        
        if (nrow(dat) != 0) {
            assign("dat",
                   dat %>%
                       mutate(Frequency = ifelse(Word == input &
                                                     N_gram == str_count(input, "\\S+"),
                                                 Frequency + 1,
                                                 Frequency)) %>%
                       group_by(., N_gram) %>%
                       mutate(., Prop = Frequency/ sum(Frequency)) %>%
                       data.frame(.),
                   envir = .GlobalEnv)
            
            val <- dat$Word_to_Predict[1]
            ans <- paste(str_squish(input), val)
            
            return(list(ans, head(dat,5)))
            
        } else if (nrow(dat) == 0 & word(input, 1) != "NA") {
            assign("dat",
                   dat %>%
                       add_row(., Word = tolower(input), Frequency = + 1, N_gram = str_count(input, "\\S+"), 
                               Word_to_Predict = word(input, -1)) %>%
                       group_by(., N_gram) %>%
                       mutate(., Prop = Frequency/ sum(Frequency)) %>%
                       data.frame(.),
                   envir = .GlobalEnv)
            
            input_1 <-  Reduce(paste, word(input, 2:str_count(input,"\\S+")))
            
            return(NextWordPrediction(input_1))
            
        } else if (word(input, 1) == "NA") {
            ans <- paste("Word not in dictionary. We added this to our database!")
            
            return(ans)
        }
    }
    
    output$predictiontext =  reactive({

        NextWordPrediction(input$text)[1]
        
    })

    output$predictiontable =  renderTable({

        NextWordPrediction(input$text)[2]
        
    })
    
})

ui.R

library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(

    # Application title
    titlePanel("NextWordPrediction"),

    # Sidebar with a slider input for number of bins
    sidebarLayout(
        sidebarPanel(
            textInput("text",
                        "Type something...",
                        "")
        ),

        # Show a plot of the generated distribution
        mainPanel(
            
            wellPanel(
                
                # Link to report
                helpText(a('More information on the app',
                           href=link, 
                           target = '_blank')
                ),
                
                # Link to repo
                helpText(a('Code repository',
                           href=link,
                           target = '_blank')
                ),
                
            textOutput("predictiontext"),
            
            tableOutput('predictiontable')
        )
    )
))
)


更新1:数据

df<- data.frame(Word = c("hello", "she was great", "this is", "long time ago in"), Frequency = c(4, 3, 10, 1),
                       N_gram = c(1, 3, 2, 4), Prop = c(4/18, 3/18, 10/18, 1/18), Word_to_Predict = c(NA, "great", "is", "in"))

NextWordPrediction("she was") ## returns "she was" & "great"

NextWordPrediction("hours ago") ## returns "hours ago" & "in"

NextWordPrediction("words not in data") ## returns "Word not in dictionary. We added this to our database!" after trying "not in data", "in data" and adds "words not in data" to dataset

0 个答案:

没有答案