Implement an affine transformaton
affine_transform(source, linear_transform, offset, ..., env = parent.frame())
relop source (or data.frame source)
matrix with row names taken from source column names (inputs), and column names are outputs.
vector of offsets with names same as column names of linear_transform.
force later arguments to bind by name
environment to look for values in.
relop node
if (requireNamespace("DBI", quietly = TRUE) &&
requireNamespace("RSQLite", quietly = TRUE)) {
my_db <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
d <- data.frame(AUC = 0.6, R2 = 0.2)
source <- rq_copy_to(my_db, 'd',
d,
overwrite = TRUE,
temporary = TRUE)
linear_transform <- matrix(c(1 ,1, 2, -1, 1, 0, 0, 0), nrow = 2)
rownames(linear_transform) <- c("AUC", "R2")
colnames(linear_transform) <- c("res1", "res2", "res3", "res4")
offset <- c(5, 7, 1, 0)
names(offset) <- colnames(linear_transform)
optree <- affine_transform(source, linear_transform, offset)
cat(format(optree))
sql <- to_sql(optree, my_db)
cat(sql)
print(DBI::dbGetQuery(my_db, sql))
print(as.matrix(d) %*% linear_transform + offset)
DBI::dbDisconnect(my_db)
}
#> mk_td("d", c(
#> "AUC",
#> "R2")) %.>%
#> affine_op(. %*% linear_transform + offset)
#> SELECT
#> `AUC`,
#> `R2`,
#> `AUC` * ( 1 ) + `R2` * ( 1 ) + 5 AS `res1`,
#> `AUC` * ( 2 ) + `R2` * ( - ( 1 ) ) + 7 AS `res2`,
#> `AUC` * ( 1 ) + 1 AS `res3`,
#> 0 AS `res4`
#> FROM (
#> SELECT
#> `AUC`,
#> `R2`
#> FROM
#> `d`
#> ) tsql_22385237322390567767_0000000000
#> AUC R2 res1 res2 res3 res4
#> 1 0.6 0.2 5.8 8 1.6 0
#> res1 res2 res3 res4
#> [1,] 5.8 8 1.6 0