Передать блестящий ввод текста в запрос rmongodb

Ниже приведена упрощенная версия моего кода. Я просто пытаюсь заставить Shiny передать входное значение в запрос rmongodb, выполнить запрос на основе пользовательского ввода и затем отобразить среднее значение переменной. Приведенный ниже код включает в себя все необходимое для репликации моей проблемы, включая вставку документов в коллекцию.

Буду очень признателен за любую помощь! Я вытаскиваю свои волосы (и не было много, чтобы начать с). Я подозреваю, что я неуместно помещаю команду реагировать () или что-то в этом роде.

Большое спасибо тому, кто может оказать помощь.

#Install required packages and call each
library(devtools)
install_github(repo = "mongosoup/rmongodb")
library(rmongodb)
library(shiny)

#Establish connection with mongodb, check status, name database and collection, insert some documents, return one document
mongo <- mongo.create()

mongo.insert(mongo, "simpledb.main",'{"user":"Joe", "age":34}')
mongo.insert(mongo, "simpledb.main",'{"user":"Joe", "age":31}')
mongo.insert(mongo, "simpledb.main",'{"user":"Joe", "age":53}')
mongo.insert(mongo, "simpledb.main",'{"user":"Kate", "age":29}')
mongo.insert(mongo, "simpledb.main",'{"user":"Lisa", "age":21}')
mongo.insert(mongo, "simpledb.main",'{"user":"Henry", "age":34}')
mongo.insert(mongo, "simpledb.main",'{"user":"David", "age":43}')

if(mongo.is.connected(mongo) == TRUE) {
  help("mongo.count")
  mongo.count(mongo, "simpledb.main")
}

if(mongo.is.connected(mongo) == TRUE) {
  mongo.find.one(mongo, "simpledb.main")
}

#Code needed for Shiny UI
ui <- fluidPage(
  fluidRow(
    column(2, textInput(inputId = "userName", label = "", value = "Enter name here"))),
  mainPanel(plotOutput(outputId = "main_plot"))
)

#Code needed for Shiny server
server <- function(input, output) {

  queryReactive <- reactive({
     nameFinal <- paste0(input$userName)
     query = mongo.bson.buffer.create()
     mongo.bson.buffer.append(query, "user", nameFinal)
     query = mongo.bson.from.buffer(query)
  })
 #Run the query and store results as an R list object
 queryresults <- mongo.find.all(mongo=mongo, ns = coll, query=queryReactive)

 #Convert the R list object into a data frame
 resultsdf <- data.frame(matrix(unlist(queryresults), nrow=length(queryresults), byrow=T), stringsAsFactors=FALSE)

  output$main_plot <- renderPlot({boxplot(as.numeric(resultsdf$X3))})

}

#Code needed to call Shiny UI and server
shinyApp(ui = ui, server = server)

1 ответ

Решение

Нет необходимости в реактивной команде в функции вашего сервера. Я упростил и исправил вашу функцию ниже:

server <- function(input, output) {

  output$main_plot <- renderPlot({
    nameFinal <- paste0(input$userName)
    query = mongo.bson.buffer.create()
    mongo.bson.buffer.append(query, "user", nameFinal)
    query = mongo.bson.from.buffer(query)
    queryresults <- mongo.find.all(mongo=mongo, ns = "simpledb.main", query=query)
    if (length(queryresults) > 0) {
        resultsdf <- data.frame(matrix(unlist(queryresults), nrow=length(queryresults), byrow=T), stringsAsFactors=FALSE)
        boxplot(as.numeric(resultsdf$X3))
    }
    else boxplot(c(0))
 })

}
Другие вопросы по тегам