使用函数构造函数将方法添加到引用类

时间:2014-09-30 20:01:00

标签: r google-analytics

我正在尝试通过skardhamar's rga简化向Google AnalyticsAPI创建和提交查询的过程。我正在领导一个为客户创建报告的小型分析团队,而我的同事使用脚本和R更不方便。因此,我正在尝试提供一些基本元素和报告模板以降低复杂性。

我们经常在网站之间进行比较,因此我创建了一个特定于配置文件的引用类,其中包含帐户ID,配置文件ID等内容。它将附带一小组预定义的查询方法,例如以下:

profile <- setRefClass("profile",
                       fields = list(
                         accountID = "character",
                         profileID = "character"),
                       methods = list(
                         topPages = function() {
                           ga$getData(profileID,
                                      start.date = helper$start,
                                      end.date = helper$end,
                                      metrics = "ga:pageviews,ga:bounceRate",
                                      dimensions = "ga:pagePath",
                                      sort = "-ga:pageviews")
                         })
                       )

我最终可能会添加一个字段来存储API返回,以限制我们正在进行的不必要的API调用的数量,但这既不在这里也不在那里。

要构造这些配置文件对象,并向其引用类添加新方法,我有一个帮助器引用类:

helper <- setRefClass("helper",
                      fields = list(
                        start = "character",
                        end = "character"),
                      methods = list(
                        newMethod = function(name="", metrics="", dimensions="",
                                             sort="") {
                          **take the passed arguments and construct a new 
                          query function**
                          **add function to the profile reference class**
                        },
                        newProfile = function(account="", profile="", name="") {
                          **search for matching account and profile**
                          **create new profile-class object with the passed name**
                        })
                      )

忽略我订购这些示例的潜在问题,我所描述的helper$newMethod()是否可能?

2 个答案:

答案 0 :(得分:0)

它不可能......当你更新引用类的方法时,新对象不会获得更新的方法。此外.self只读取初始化函数之外的内容,因此无法进行自我更新。

答案 1 :(得分:0)

此示例是否可以帮助您进一步了解所需内容?

profile <- setRefClass("profile")
profile$methods(newMethod = function(...) {
  .call <- match.call()
  .call[[1]] <- quote(profile$methods)
  eval(.call)
  profile$new()
})
z <- profile$new()$newMethod(sum=function(x,y){x+y})
z$sum(1,2)