0

我是 R 的新手,
我正在尝试使用我创建的 sql 数据库在 Shiny 中绘制控制图。
在下面的代码中,我能够按日期获取 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  

在绘图选项卡中,我收到以下错误:
错误:'data' must be of a vector type, was '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)

4

1 回答 1

0

错误在您的renderPlot函数中。

请注意,renderTable函数中的最后一个命令是dbGetQuery(conn, query). 这会从数据库中获取数据,并且因为它是最后一个命令,所以该命令的结果就是传递给 UI 的结果。

相比之下,renderPlot您可以通过两种不同的方式访问同一个表:

  1. 直接作为dbGetQuery(conn, query)但不将获取的结果存储在本地。
  2. 作为一个远程表,ceatdb <- tbl(conn, "Ceat_table")使用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)。本地表将为这两个命令提供相同的结果,但远程表不会。

于 2020-04-20T21:04:01.123 回答