如何将列添加到monet.frame
-object?
monet.frame
例如,如果我想向被调用 添加一个简单的行 ID data
,我可以通过执行以下操作来实现:
from <- gsub("^SELECT(.)+FROM", "", data$query)
addid_query <- gsub("data", from,
"SELECT *, ROW_NUMBER() OVER () AS id FROM data"
attr(data, "query") <- addidquery
但必须有一种不那么老套的方式。如果您按照上面给出的方式执行此操作,则新创建的id
-column 在您执行时不会显示,str(data)
或者names(data)
,例如,因为当底层数据库更改时该信息不会更新 --- 它是在data
初始化时生成的,而不是在调用这些访问函数的位置。它确实在直接访问行时出现,data
因为查询会按写入方式执行。
像上面这样的事情仍然安全吗?
更一般地说,我需要做一些monet.frame
超出包中可用功能的事情,并且有兴趣知道如何在 a 上运行更一般的 SQL 查询monet.frame
,类似于dplyr
's sql()
-function 允许的内容。我会很感激这方面的任何指示——例如,我是否必须使用dbSendQuery
etc. 并将其结果转换为 new monet.frame
?如何?
编辑:
没关系,应该更仔细地阅读手册,我没有看到它monet.frame
接受可以解释为 SQL 查询的字符串以及数据库中已经存在的表名。
这就是我现在的做法:
#' Apply general SQL queries to a monet.frame object and return the
#' result in a new monet.frame.
#'
#' @param data a \code{monet.frame} object
#' @param query an SQL query, using "_DATA_" as the placeholder for the
#' name of the table underlying the \code{data}-object.
transform.monet.frame <- function(data, query){
nm <- paste(sample(letters, 15, rep=TRUE), collapse="")
query <- gsub("_DATA_", paste("(", attr(data, "query"), ") AS", nm), query)
monet.frame(attr(data, "conn"), query)
}
newdata <- transform(data,
"SELECT *, ROW_NUMBER() OVER () AS id FROM _DATA_")
编辑 2:如果应用于由涉及 ORDER、LIMIT 或 OFFSET 语句的查询monet.frame
创建的 a ,这将中断。transform.monet.frame