Невозможно получить значения столбца от sql в R блестящий для конкретной даты - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок ie в R
Я пытаюсь построить контрольную диаграмму в Shiny, используя созданную мной базу данных sql.
В приведенном ниже коде я могу получить данные sql на дату .
но я не могу получить доступ к значениям столбцов, для которых мне нужно построить график.
Ниже приведены первые несколько строк базы данных:

id   product_name    product_config  detected_width  created  
1    Belt            width           69.84           2020-04-19  
2    Belt            width           71.12           2020-04-19  

На вкладке графика, Я получаю следующую ошибку:
Ошибка: «данные» должны быть векторного типа, было «NULL»
Таким образом, значения столбца не выбираются, я думаю. Может кто-нибудь, пожалуйста, помогите с этим.

library(pool)
library(dplyr)
library(shiny)
library(DBI)
library(plotly)
library(qcc)

ui <- fluidPage(
  fluidRow(
    column(4,
           h3("Selecting Data"),
           dateInput("date", "Enter a date:", value = Sys.Date())
    ),
    column(8,
           h3("Plot"),
           tabsetPanel(
             tabPanel("Table", tableOutput("tbl")), 
             tabPanel("Control Chart",plotOutput("plot"))
    )
  )
 )
)

server <- function(input, output, session){
  output$tbl <- renderTable({
    conn <- dbConnect(
      drv = RMySQL::MySQL(),
      dbname = "testdatabase",
      host = "localhost",
      username = "root",
      password = "root"
    )
    on.exit(dbDisconnect(conn), add = TRUE)
    sql <- "SELECT * FROM Ceat_table WHERE created = ?date1;"
    query <- sqlInterpolate(conn, sql, date1 = input$date)
    dbGetQuery(conn, query)
  })
  output$plot <- renderPlot({
    conn <- dbConnect(
      drv = RMySQL::MySQL(),
      dbname = "testdatabase",
      host = "localhost",
      username = "root",
      password = "root"
    )
    on.exit(dbDisconnect(conn), add = TRUE)
    sql <- "SELECT * FROM Ceat_table WHERE created = ?date1;"
    query <- sqlInterpolate(conn, sql, date1 = input$date)
    dbGetQuery(conn, query)
    ceatdb <- tbl(conn, "Ceat_table")
    a<-qcc(ceatdb$detected_width,type = "xbar.one")
    plot(a)
  })
}


shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 21 апреля 2020

Ошибка в вашей функции renderPlot.

Обратите внимание, что последняя команда в вашей функции renderTable - dbGetQuery(conn, query). Это выбирает данные из базы данных, и, поскольку это последняя команда, результаты этой команды передаются в пользовательский интерфейс.

В отличие от функции renderPlot, вы получаете доступ к одной и той же таблице двумя разными способами. :

  1. Непосредственно как dbGetQuery(conn, query), но без сохранения полученных результатов локально.
  2. В качестве удаленной таблицы с ceatdb <- tbl(conn, "Ceat_table"), но без полной загрузки результатов в R с использованием collect().

Я рекомендую использовать только один из этих подходов.

Вариант 1: сохранить результаты dbGetQuery:

conn <- dbConnect( your_connection_details_here )
on.exit(dbDisconnect(conn), add = TRUE)
sql <- "SELECT * FROM Ceat_table WHERE created = ?date1;"
query <- sqlInterpolate(conn, sql, date1 = input$date)

ceatdb = dbGetQuery(conn, query) # key change

a<-qcc(ceatdb$detected_width,type = "xbar.one")
plot(a)

Вариант 2: загрузить удаленный таблица в память с collect():

conn <- dbConnect( your_connection_details_here )
on.exit(dbDisconnect(conn), add = TRUE)

ceatdb <- tbl(conn, "Ceat_table") %>% collect() # key change

a<-qcc(ceatdb$detected_width,type = "xbar.one")
plot(a)

Обратите внимание, что для удаленных таблиц запись $ не может использоваться для доступа к столбцам так же, как для локальных таблиц. Один из способов продемонстрировать это - сравнить выходные данные names(my_table) и colnames(my_table). Локальные таблицы будут давать одинаковые результаты для обеих этих команд, а удаленные таблицы - нет.

...