mutate

John Mount

2017-11-17

go <- requireNamespace("DBI", quietly = TRUE) &&
  requireNamespace("RSQLite", quietly = TRUE)

From dplyr issue 3095.

if(go) {
  suppressPackageStartupMessages(library("dplyr"))
  packageVersion("dplyr")
  
  db <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
  d <- copy_to(db, data.frame(a = 1))
  
  # works
   d %>% 
    mutate(a2 := a, a3 := a2) %>%
    show_query()
  d %>% 
    mutate(a2 := a, a3 := a2) %>%
    print()
  
  # fails
   d %>% 
    mutate(a2 := a, a3 := a2, a4 := a3) %>%
    show_query()
  d %>% 
    mutate(a2 := a, a3 := a2, a4 := a3) %>%
    print()
}
## <SQL>
## SELECT `a`, `a2`, `a2` AS `a3`
## FROM (SELECT `a`, `a` AS `a2`
## FROM `data.frame(a = 1)`)
## # Source:   lazy query [?? x 3]
## # Database: sqlite 3.19.3 [:memory:]
##       a    a2    a3
##   <dbl> <dbl> <dbl>
## 1     1     1     1
## <SQL>
## SELECT `a`, `a2`, `a2` AS `a3`, `a3` AS `a4`
## FROM (SELECT `a`, `a` AS `a2`
## FROM `data.frame(a = 1)`)
## Error in rsqlite_send_query(conn@ptr, statement): no such column: a3

Current work around, dev verson of seplyr.

if(go) {
  library("seplyr")
  packageVersion("seplyr")
  
  # works
   d %>% 
    mutate_nse(a2 := a, a3 := a2, a4 := a3) %>%
    show_query()
  d %>% 
    mutate_nse(a2 := a, a3 := a2, a4 := a3) %>%
    print()
}
## <SQL>
## SELECT `a`, `a2`, `a3`, `a3` AS `a4`
## FROM (SELECT `a`, `a2`, `a2` AS `a3`
## FROM (SELECT `a`, `a` AS `a2`
## FROM `data.frame(a = 1)`))
## # Source:   lazy query [?? x 4]
## # Database: sqlite 3.19.3 [:memory:]
##       a    a2    a3    a4
##   <dbl> <dbl> <dbl> <dbl>
## 1     1     1     1     1