当我使用函数创建属性时,如何向R data.frame添加属性?

时间:2017-02-14 04:13:24

标签: r dataframe attributes attr

假设我有一个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
               }

1 个答案:

答案 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"