假设我有一个R data.frame:
EXTENSION_SECRET
我还有一个用sprintf()构建的SQL查询:
> x <- data.frame()
我打算在一个函数中加入这个函数,以便用> (query <- sprintf("select %s from %s %s", "names", "name_table", "where age > 20"))
[1] "select names from name_table where age > 20"
的结果填充data.frame x
,并且只是为了在顶部填充几个我想告诉我未来的自我query
用于生成data.frame query
的内容。我想这样打电话给x
就像这样:
attr()
因为该功能看起来像
> attr(x, "query") <- query
> str(x)
'data.frame': 0 obs. of 0 variables
- attr(*, "query")= chr "select names from name_table where age > 20"
稍后我将能够执行以下操作
answer_maker <- function(col_names, table_name, condtions) {
query <- sprintf("select %s from %s %s", col_names, table_name, conditions)
data.frame(sql(query))
############## WHAT DO I DO HERE?
############## I want to type something py-like ...self.attr()?
attr(self, "query") <- query
}
答案 0 :(得分:2)
请注意,R中的数据库函数通常会返回一个数据框,因此您不必填充空的现有数据框。下面我们使用sqldf包来保持示例自包含且可重现,但您可以替换正在使用的任何类型的数据库访问。 (通常,您需要创建数据库连接并将其传递到answer_maker
,但在此示例中,因为我们使用的是sqldf,所以不需要它。)
library(sqldf)
name_table <- data.frame(names = letters, age = 1:26) # test data
answer_maker <- function(col_names, table_name, conditions) {
query <- sprintf("select %s from %s %s", col_names, table_name, conditions)
ans <- sqldf(query)
attr(ans, "query") <- query
ans
}
ans <- answer_maker("names", "name_table", "where age > 20")
,并提供:
> ans
names
1 u
2 v
3 w
4 x
5 y
6 z
> attr(ans, "query")
[1] "select names from name_table where age > 20"
引用类使用R的引用类,我们可以定义一个包含数据和查询字段的类以及存储查询并运行它的方法,以便每个类使用.self
输出对象:
Query <- setRefClass("Query", fields = c("data", "query"),
methods = list(
setQuery = function(col_names, table_name, conditions) {
query <<- sprintf("select %s from %s %s", col_names, table_name, conditions)
.self
},
runQuery = function() {
data <<- sqldf(query)
.self
}))
qq <- Query$
new()$
setQuery("names", "name_table", "where age > 20")$
runQuery()
,并提供:
> qq$data
names
1 u
2 v
3 w
4 x
5 y
6 z
> qq$query
[1] "select names from name_table where age > 20"