1

如何将列添加到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 允许的内容。我会很感激这方面的任何指示——例如,我是否必须使用dbSendQueryetc. 并将其结果转换为 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

4

0 回答 0