shiny工程化實踐之數據庫

dplyr:翻譯R到SQL

  • 基本數學運算: +, -, *, /, %%, ^html

  • 數學函數: abs, acos, acosh, asin, asinh, atan, atan2, atanh, ceiling, cos, cosh, cot, coth, exp, floor, log, log10, round, sign, sin, sinh, sqrt, tan, tanhreact

  • 邏輯判斷: <, <=, !=, >=, >, ==, %in%web

  • 異或判斷: &, &&, |, ||, !, xorsql

  • 聚合函數: mean, sum, min, max, sd, var數據庫

支持常見的 SparkHiveMySQL做爲計算引擎。apache

使用 explain 函數能夠查看到對應的SQL翻譯:segmentfault

explain(your_dplyr_manipulation_chain)

pool:鏈接池管理

爲何在操做數據庫上不是直接使用DBI,而是要多加一層pool呢?答案很簡單,由於使用pool能夠作鏈接池的管理,複用連接提高性能。pool爲使用者提供了一個僞連接,若是是一條以前請求過的SQL,那麼pool會將以前請求過的數據直接返回而無需等待。服務器

Shiny中,pool會在全部session都結束的時候自動地回收資源而不須要其餘操做。session

這裏是shiny官方blog上的一個例子:函數

library(shiny)
library(DBI)
library(pool)

pool <- dbPool(
  drv = RMySQL::MySQL(),
  dbname = "shinydemo",
  host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
  username = "guest",
  password = "guest"
)

ui <- fluidPage(
  textInput("ID", "Enter your ID:", "5"),
  tableOutput("tbl"),
  numericInput("nrows", "How many cities to show?", 10),
  plotOutput("popPlot")
)

server <- function(input, output, session) {
  output$tbl <- renderTable({
    sql <- "SELECT * FROM City WHERE ID = ?id;"
    query <- sqlInterpolate(pool, sql, id = input$ID)
    dbGetQuery(pool, query)
  })
  output$popPlot <- renderPlot({
    query <- paste0("SELECT * FROM City LIMIT ",
                    as.integer(input$nrows)[1], ";")
    df <- dbGetQuery(pool, query)
    pop <- df$Population
    names(pop) <- df$Name
    barplot(pop)
  })
}

shinyApp(ui, server)

數據庫操做之事務

原來的顯示事務操做

conn <- poolCheckout(pool)

dbWithTransaction(conn, {
  dbGetQuery(conn, A)
  dbGetQuery(conn, B)
})

poolReturn(conn)

如今的隱式事務操做

dbWithTransaction(pool, {
  dbGetQuery(pool, A)
  dbGetQuery(pool, B)
})

輸入異常處理

由於有了req函數,咱們能夠在響應式代碼塊中輕鬆應對下面幾類類似地空值判斷:

  1. FALSE

  2. NULL

  3. ""

  4. 空的原子向量

  5. 僅僅包含缺失值的原子向量

  6. try-error 類的對象中出現包含的 FALSE 的邏輯向量 (可見於 ?base::try)

  7. 是否點擊了 actionButton

下面是shiny 官方博客中的一個例子

library(shiny)

ui <- fluidPage(
  selectInput("datasetName", "Dataset", c("", "pressure", "cars")),
  plotOutput("plot"),
  tableOutput("table")
)

server <- function(input, output, session) {
  dataset <- reactive({
    # Make sure requirements are met
    req(input$datasetName)

    get(input$datasetName, "package:datasets", inherits = FALSE)
  })

  output$plot <- renderPlot({
    plot(dataset())
  })

  output$table <- renderTable({
    head(dataset(), 10)
  })
}

shinyApp(ui, server)

參考資料

相關文章
相關標籤/搜索