2014-09-30 3 views
0

Я пытаюсь упростить процесс создания и отправки запросов в API Google Analytics через skardhamar's rga. Я возглавляю небольшую группу аналитиков, которая создает отчеты для клиентов, а мои коллеги гораздо менее удобны в работе со сценариями и R. Как таковой, я пытаюсь предоставить несколько базовых элементов и шаблон отчета, чтобы уменьшить сложность.Использование конструктора функций для добавления методов в ссылочный класс

Мы часто проводим сравнения между сайтами, поэтому я создал ссылочный класс, специфичный для профиля, который содержит такие вещи, как 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() Я описал это даже возможно?

+0

Если я понимаю, что вы хотите создать метод «на лету» или динамически для класса/объекта из другого объекта? Если да, можете ли вы сократить свои классы и удалить всю ненужную информацию, чтобы привести только небольшой пример? – agstudy

ответ

0

Его невозможно ... при обновлении методов ссылочного класса новые объекты не получают обновленные методы. Кроме того, сам читается только вне функции инициализации, поэтому не было бы возможности самостоятельно обновлять.

+1

Даже если я добавляю эти методы перед созданием объектов, специфичных для профиля? Я видел это больше как средство изолировать мою команду от исходных скриптов, чем изменять объекты на лету. Таким образом, они будут использовать конструктор метода во главе своего документа перед использованием 'profile $ new()'. – mattpolicastro

+0

Ahh Я, должно быть, пропустил вашу проблему немного. Если ваша функция newMethod возвращает новые объекты, вы можете вызвать профиль $ methods() перед профилем $ new(), а новые объекты будут иметь новые методы. Я думал, что вы хотите обновить методы существующего объекта при вызове метода newMethod. –

+0

О, нет, конструкция метода возникла бы до того, как будут созданы какие-либо экземпляры 'profile'. Как мне добавить добавление нового построенного метода в 'profile $ methods'? – mattpolicastro

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) 
+0

Думаю, я не совсем понимаю, что происходит внутри 'profile $ methods', но я буду играть с ним. Спасибо за указатели. – mattpolicastro

Смежные вопросы